b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/*
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * CDDL HEADER START
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai *
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * The contents of this file are subject to the terms of the
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * Common Development and Distribution License (the "License").
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * You may not use this file except in compliance with the License.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai *
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * or http://www.opensolaris.org/os/licensing.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * See the License for the specific language governing permissions
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * and limitations under the License.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai *
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * When distributing Covered Code, include this CDDL HEADER in each
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * If applicable, add the following below this CDDL HEADER, with the
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * fields enclosed by brackets "[]" replaced with your own identifying
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * information: Portions Copyright [yyyy] [name of copyright owner]
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai *
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * CDDL HEADER END
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/*
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <sys/types.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <string.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <strings.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <sys/mac.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <sys/dls_mgmt.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <sys/dlpi.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <net/simnet.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <errno.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <unistd.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <libdladm_impl.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <libdllink.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <libdlaggr.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai#include <libdlsim.h>
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t dladm_simnet_persist_conf(dladm_handle_t, const char *,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t *);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* New simnet instance creation */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_create_simnet(dladm_handle_t handle, dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai int rc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status = DLADM_STATUS_OK;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai simnet_ioc_create_t ioc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&ioc, sizeof (ioc));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sic_link_id = attrp->sna_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sic_type = attrp->sna_type;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (attrp->sna_mac_len > 0 && attrp->sna_mac_len <= MAXMACADDRLEN) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sic_mac_len = attrp->sna_mac_len;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bcopy(attrp->sna_mac_addr, ioc.sic_mac_addr, ioc.sic_mac_len);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai rc = ioctl(dladm_dld_fd(handle), SIMNET_IOC_CREATE, &ioc);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (rc < 0)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_errno2status(errno);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bcopy(ioc.sic_mac_addr, attrp->sna_mac_addr, MAXMACADDRLEN);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_mac_len = ioc.sic_mac_len;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Modify existing simnet instance */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_modify_simnet(dladm_handle_t handle, dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai int rc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status = DLADM_STATUS_OK;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai simnet_ioc_modify_t ioc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&ioc, sizeof (ioc));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sim_link_id = attrp->sna_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sim_peer_link_id = attrp->sna_peer_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai rc = ioctl(dladm_dld_fd(handle), SIMNET_IOC_MODIFY, &ioc);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (rc < 0)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_errno2status(errno);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Delete simnet instance */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_delete_simnet(dladm_handle_t handle, dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai int rc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status = DLADM_STATUS_OK;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai simnet_ioc_delete_t ioc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&ioc, sizeof (ioc));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sid_link_id = attrp->sna_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai rc = ioctl(dladm_dld_fd(handle), SIMNET_IOC_DELETE, &ioc);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (rc < 0)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_errno2status(errno);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Retrieve simnet instance information */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_get_simnet_info(dladm_handle_t handle, dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai int rc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status = DLADM_STATUS_OK;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai simnet_ioc_info_t ioc;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&ioc, sizeof (ioc));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai ioc.sii_link_id = attrp->sna_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai rc = ioctl(dladm_dld_fd(handle), SIMNET_IOC_INFO, &ioc);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (rc < 0) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_errno2status(errno);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bcopy(ioc.sii_mac_addr, attrp->sna_mac_addr, MAXMACADDRLEN);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_mac_len = ioc.sii_mac_len;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_peer_link_id = ioc.sii_peer_link_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_type = ioc.sii_type;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Retrieve simnet configuratin */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_get_simnet_info_persist(dladm_handle_t handle,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_conf_t conf;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai char macstr[ETHERADDRL * 3];
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy char simnetpeer[MAXLINKNAMELEN];
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint64_t u64;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai boolean_t mac_fixed;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_getsnap_conf(handle, attrp->sna_link_id,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &conf)) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_get_conf_field(handle, conf, FSIMNETTYPE, &u64,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai sizeof (u64));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_type = (uint_t)u64;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_get_conf_field(handle, conf, FMADDRLEN, &u64,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai sizeof (u64));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_mac_len = (uint_t)u64;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_get_conf_field(handle, conf, FMACADDR, macstr,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai sizeof (macstr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_aggr_str2macaddr(macstr, &mac_fixed, attrp->sna_mac_addr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Peer field is optional and only set when peer is attached */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (dladm_get_conf_field(handle, conf, FSIMNETPEER, simnetpeer,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy sizeof (simnetpeer)) == DLADM_STATUS_OK) {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy status = dladm_name2info(handle, simnetpeer,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy &attrp->sna_peer_link_id, NULL, NULL, NULL);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy } else {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_peer_link_id = DATALINK_INVALID_LINKID;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidone:
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_destroy_conf(handle, conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_create(dladm_handle_t handle, const char *simnetname,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint_t media, uint32_t flags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_id_t simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t attr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_NOTSUP);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai flags &= (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_create_datalink_id(handle, simnetname,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DATALINK_CLASS_SIMNET, media, flags,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai &simnet_id)) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&attr, sizeof (attr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_link_id = simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_type = media;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_create_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (!(flags & DLADM_OPT_PERSIST))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_simnet_persist_conf(handle, simnetname, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) i_dladm_delete_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_set_linkprop(handle, simnet_id, NULL, NULL, 0, flags);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidone:
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_destroy_datalink_id(handle, simnet_id, flags);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Update existing simnet configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_simnet_update_conf(dladm_handle_t handle, datalink_id_t simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_id_t peer_simnet_id)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_conf_t conf;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy char simnetpeer[MAXLINKNAMELEN];
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_open_conf(handle, simnet_id, &conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* First clear previous peer if any in configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_unset_conf_field(handle, conf, FSIMNETPEER);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (peer_simnet_id != DATALINK_INVALID_LINKID) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_datalink_id2info(handle,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy peer_simnet_id, NULL, NULL, NULL, simnetpeer,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy sizeof (simnetpeer))) == DLADM_STATUS_OK) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_set_conf_field(handle, conf,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy FSIMNETPEER, DLADM_TYPE_STR, simnetpeer);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto fail;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_write_conf(handle, conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaifail:
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_destroy_conf(handle, conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Modify attached simnet peer */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_modify(dladm_handle_t handle, datalink_id_t simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_id_t peer_simnet_id, uint32_t flags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t attr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t prevattr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_class_t class;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint32_t linkflags;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint32_t peerlinkflags;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_NOTSUP);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((dladm_datalink_id2info(handle, simnet_id, &linkflags, &class,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai NULL, NULL, 0) != DLADM_STATUS_OK))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (class != DATALINK_CLASS_SIMNET)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (peer_simnet_id != DATALINK_INVALID_LINKID) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (dladm_datalink_id2info(handle, peer_simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai &peerlinkflags, &class, NULL, NULL, 0) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (class != DATALINK_CLASS_SIMNET)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Check to ensure the peer link has identical flags */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (peerlinkflags != linkflags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Retrieve previous attrs before modification */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&prevattr, sizeof (prevattr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_simnet_info(handle, simnet_id, &prevattr,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai flags)) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&attr, sizeof (attr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_link_id = simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_peer_link_id = peer_simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_modify_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status != DLADM_STATUS_OK) || !(flags & DLADM_OPT_PERSIST))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* First we clear link's existing peer field in config */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_simnet_update_conf(handle, simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DATALINK_INVALID_LINKID);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Clear the previous peer link's existing peer field in config */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (prevattr.sna_peer_link_id != DATALINK_INVALID_LINKID) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_simnet_update_conf(handle,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai prevattr.sna_peer_link_id, DATALINK_INVALID_LINKID);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Update the configuration in both simnets with any new peer link */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (peer_simnet_id != DATALINK_INVALID_LINKID) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_simnet_update_conf(handle, simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai peer_simnet_id);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status == DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_simnet_update_conf(handle,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai peer_simnet_id, simnet_id);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_delete(dladm_handle_t handle, datalink_id_t simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint32_t flags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t attr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t prevattr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_class_t class;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((dladm_datalink_id2info(handle, simnet_id, NULL, &class,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai NULL, NULL, 0) != DLADM_STATUS_OK))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (class != DATALINK_CLASS_SIMNET)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Check current simnet attributes before deletion */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai flags &= (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&prevattr, sizeof (prevattr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_simnet_info(handle, simnet_id, &prevattr,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai flags)) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&attr, sizeof (attr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_link_id = simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (flags & DLADM_OPT_ACTIVE) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_delete_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status == DLADM_STATUS_OK) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_set_linkprop(handle, simnet_id, NULL,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai NULL, 0, DLADM_OPT_ACTIVE);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_destroy_datalink_id(handle, simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_ACTIVE);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai } else if (status != DLADM_STATUS_NOTFOUND) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (flags & DLADM_OPT_PERSIST) {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (void) dladm_remove_conf(handle, simnet_id);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_destroy_datalink_id(handle, simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /* Update any attached peer configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (prevattr.sna_peer_link_id != DATALINK_INVALID_LINKID)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_simnet_update_conf(handle,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai prevattr.sna_peer_link_id, DATALINK_INVALID_LINKID);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Retrieve simnet information either active or from configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_info(dladm_handle_t handle, datalink_id_t simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t *attrp, uint32_t flags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai datalink_class_t class;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((dladm_datalink_id2info(handle, simnet_id, NULL, &class,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai NULL, NULL, 0) != DLADM_STATUS_OK))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (class != DATALINK_CLASS_SIMNET)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(attrp, sizeof (attrp));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attrp->sna_link_id = simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (flags & DLADM_OPT_ACTIVE) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_get_simnet_info(handle, attrp);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /*
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * If no active simnet found then return any simnet
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * from stored config if requested.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status == DLADM_STATUS_NOTFOUND &&
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (flags & DLADM_OPT_PERSIST))
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (i_dladm_get_simnet_info_persist(handle, attrp));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai } else if (flags & DLADM_OPT_PERSIST) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (i_dladm_get_simnet_info_persist(handle, attrp));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai } else {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_BADARG);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Bring up simnet from stored configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic int
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaii_dladm_simnet_up(dladm_handle_t handle, datalink_id_t simnet_id, void *arg)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t *statusp = arg;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t attr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t peer_attr;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai bzero(&attr, sizeof (attr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai attr.sna_link_id = simnet_id;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_simnet_info(handle, simnet_id, &attr,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_create_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai /*
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * When bringing up check if the peer link is available, if it
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai * is then modify the simnet and attach the peer link.
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((attr.sna_peer_link_id != DATALINK_INVALID_LINKID) &&
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (dladm_simnet_info(handle, attr.sna_peer_link_id, &peer_attr,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_ACTIVE) == DLADM_STATUS_OK)) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = i_dladm_modify_simnet(handle, &attr);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_up_datalink_id(handle, simnet_id)) !=
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_STATUS_OK) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_simnet_delete(handle, simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidone:
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai *statusp = status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_WALK_CONTINUE);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Bring up simnet instance(s) from configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* ARGSUSED */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_up(dladm_handle_t handle, datalink_id_t simnet_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint32_t flags)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (simnet_id == DATALINK_ALL_LINKID) {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) dladm_walk_datalink_id(i_dladm_simnet_up, handle,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai &status, DATALINK_CLASS_SIMNET, DATALINK_ANY_MEDIATYPE,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_OPT_PERSIST);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (DLADM_STATUS_OK);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai } else {
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai (void) i_dladm_simnet_up(handle, simnet_id, &status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai }
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai/* Store simnet configuration */
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaistatic dladm_status_t
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidladm_simnet_persist_conf(dladm_handle_t handle, const char *name,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_simnet_attr_t *attrp)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dladm_conf_t conf;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_status_t status;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai char mstr[ETHERADDRL * 3];
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai uint64_t u64;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if ((status = dladm_create_conf(handle, name, attrp->sna_link_id,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DATALINK_CLASS_SIMNET, attrp->sna_type, &conf)) != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_set_conf_field(handle, conf, FMACADDR,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_TYPE_STR, dladm_aggr_macaddr2str(attrp->sna_mac_addr, mstr));
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai u64 = attrp->sna_type;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_set_conf_field(handle, conf, FSIMNETTYPE,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_TYPE_UINT64, &u64);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai u64 = attrp->sna_mac_len;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_set_conf_field(handle, conf, FMADDRLEN,
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai DLADM_TYPE_UINT64, &u64);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai if (status != DLADM_STATUS_OK)
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai goto done;
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai status = dladm_write_conf(handle, conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavaidone:
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai dladm_destroy_conf(handle, conf);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai return (status);
b509e89b2befbaa42939abad9da1d7f5a8c6aaaeRishi Srivatsavai}