0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * CDDL HEADER START
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * The contents of this file are subject to the terms of the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Common Development and Distribution License (the "License").
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * You may not use this file except in compliance with the License.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * See the License for the specific language governing permissions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * and limitations under the License.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * When distributing Covered Code, include this CDDL HEADER in each
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * If applicable, add the following below this CDDL HEADER, with the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * fields enclosed by brackets "[]" replaced with your own identifying
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * information: Portions Copyright [yyyy] [name of copyright owner]
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * CDDL HEADER END
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * Copyright (c) 2014, Joyent, Inc. All rights reserved.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * Copyright 2015 Garrett D'Amore <garrett@damore.org>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The linkprop get() callback.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * - pd: pointer to the prop_desc_t
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - propstrp: a property string array to keep the returned property.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Caller allocated.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - cntp: number of returned properties.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Caller also uses it to indicate how many it expects.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeytypedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems datalink_media_t, uint_t, uint_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The linkprop set() callback.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - propval: a val_desc_t array which keeps the property values to be set.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - cnt: number of properties to be set.
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * - flags: additional flags passed down the system call.
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * pd_set takes val_desc_t given by pd_check(), translates it into
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * a format suitable for kernel consumption. This may require allocation
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * of ioctl buffers etc. pd_set() may call another common routine (used
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * by all other pd_sets) which invokes the ioctl.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeytypedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The linkprop check() callback.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - propstrp: property string array which keeps the property to be checked.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - cnt: number of properties.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - propval: return value; the property values of the given property strings.
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * pd_check checks that the input values are valid. It does so by
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * iteraring through the pd_modval list for the property. If
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * the modifiable values cannot be expressed as a list, a pd_check
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * specific to this property can be used. If the input values are
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * verified to be valid, pd_check allocates a val_desc_t and fills it
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * with either a val_desc_t found on the pd_modval list or something
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * generated on the fly.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeytypedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhanstatic dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhanstatic dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic dladm_status_t i_dladm_get_public_prop(dladm_handle_t, datalink_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic dladm_status_t i_dladm_set_private_prop(dladm_handle_t, datalink_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic dladm_status_t i_dladm_get_priv_prop(dladm_handle_t, datalink_id_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *, char **, uint_t *, dladm_prop_type_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic const char *dladm_perm2str(uint_t, char *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic link_attr_t *dladm_name2prop(const char *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic link_attr_t *dladm_id2prop(mac_prop_id_t);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic pd_getf_t get_zone, get_autopush, get_rate_mod, get_rate,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_speed, get_channel, get_powermode, get_radio,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_duplex, get_link_state, get_binary, get_uint32,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_flowctl, get_maxbw, get_cpus, get_priority,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_tagmode, get_range, get_stp, get_bridge_forward,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_bridge_pvid, get_protection, get_rxrings,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek get_txrings, get_cntavail, get_secondary_macs,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic pd_setf_t set_zone, set_rate, set_powermode, set_radio,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi set_bridge_forward, set_bridge_pvid, set_secondary_macs,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic pd_checkf_t check_zone, check_autopush, check_rate, check_hoplimit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer check_encaplim, check_uint32, check_maxbw, check_cpus,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer check_stp_prop, check_bridge_pvid, check_allowedips,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek check_allowedcids, check_secondary_macs, check_rings,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * link property name
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * default property value, can be set to { "", NULL }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * list of optional property values, can be NULL.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This is set to non-NULL if there is a list of possible property
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * values. pd_optval would point to the array of possible values.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * count of the above optional property values. 0 if pd_optval is NULL.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * callback to set link property; set to NULL if this property is
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * read-only and may be called before or after permanent update; see
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * callback to get modifiable link property
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * callback to get current link property
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * callback to validate link property value, set to NULL if pd_optval
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * is not NULL. In that case, validate the value by comparing it with
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the pd_optval. Return a val_desc_t array pointer if the value is
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini#define PD_TEMPONLY 0x1 /* property is temporary only */
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini#define PD_CHECK_ALLOC 0x2 /* alloc vd_val as part of pd_check */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define PD_AFTER_PERM 0x4 /* pd_set after db update; no temporary */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * indicate link classes this property applies to.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * indicate link media type this property applies to.
3fd94f8c011031b38162a1db3b554de4371c167fam#define MAC_PROP_BUFSIZE(v) sizeof (dld_ioc_macprop_t) + (v) - 1
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * Supported link properties enumerated in the prop_table[] array are
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * computed using the callback functions in that array. To compute the
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * property value, multiple distinct system calls may be needed (e.g.,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * for wifi speed, we need to issue system calls to get desired/supported
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * rates). The link_attr[] table enumerates the interfaces to the kernel,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * and the type/size of the data passed in the user-kernel interface.
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_DUPLEX, sizeof (link_duplex_t), "duplex"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_SPEED, sizeof (uint64_t), "speed"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_STATUS, sizeof (link_state_t), "state"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_AUTONEG, sizeof (uint8_t), "adv_autoneg_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_FLOWCTRL, sizeof (link_flowctrl_t), "flowctrl"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ZONE, sizeof (dld_ioc_zid_t), "zone"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_AUTOPUSH, sizeof (struct dlautopush), "autopush"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_ADV_5000FDX_CAP, sizeof (uint8_t), "adv_5000fdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_EN_5000FDX_CAP, sizeof (uint8_t), "en_5000fdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_ADV_2500FDX_CAP, sizeof (uint8_t), "adv_2500fdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_EN_2500FDX_CAP, sizeof (uint8_t), "en_2500fdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_ADV_100GFDX_CAP, sizeof (uint8_t), "adv_100gfdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_EN_100GFDX_CAP, sizeof (uint8_t), "en_100gfdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_ADV_40GFDX_CAP, sizeof (uint8_t), "adv_40gfdx_cap"},
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { MAC_PROP_EN_40GFDX_CAP, sizeof (uint8_t), "en_40gfdx_cap"},
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { MAC_PROP_ADV_10GFDX_CAP, sizeof (uint8_t), "adv_10gfdx_cap"},
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { MAC_PROP_EN_10GFDX_CAP, sizeof (uint8_t), "en_10gfdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_1000FDX_CAP, sizeof (uint8_t), "adv_1000fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_1000FDX_CAP, sizeof (uint8_t), "en_1000fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_1000HDX_CAP, sizeof (uint8_t), "adv_1000hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_1000HDX_CAP, sizeof (uint8_t), "en_1000hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_100FDX_CAP, sizeof (uint8_t), "adv_100fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_100FDX_CAP, sizeof (uint8_t), "en_100fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_100HDX_CAP, sizeof (uint8_t), "adv_100hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_100HDX_CAP, sizeof (uint8_t), "en_100hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_10FDX_CAP, sizeof (uint8_t), "adv_10fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_10FDX_CAP, sizeof (uint8_t), "en_10fdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_ADV_10HDX_CAP, sizeof (uint8_t), "adv_10hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_EN_10HDX_CAP, sizeof (uint8_t), "en_10hdx_cap"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_ESSID, sizeof (wl_linkstatus_t), "essid"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_BSSID, sizeof (wl_bssid_t), "bssid"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_BSSTYPE, sizeof (wl_bss_type_t), "bsstype"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_LINKSTATUS, sizeof (wl_linkstatus_t), "wl_linkstatus"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan /* wl_rates_t has variable length */
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_DESIRED_RATES, sizeof (wl_rates_t), "desired_rates"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan /* wl_rates_t has variable length */
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_SUPPORTED_RATES, sizeof (wl_rates_t), "supported_rates"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_AUTH_MODE, sizeof (wl_authmode_t), "authmode"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_ENCRYPTION, sizeof (wl_encryption_t), "encryption"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_RSSI, sizeof (wl_rssi_t), "signal"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_PHY_CONFIG, sizeof (wl_phy_conf_t), "phy_conf"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_CAPABILITY, sizeof (wl_capability_t), "capability"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_WPA, sizeof (wl_wpa_t), "wpa"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan /* wl_wpa_ess_t has variable length */
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_SCANRESULTS, sizeof (wl_wpa_ess_t), "scan_results"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_POWER_MODE, sizeof (wl_ps_mode_t), "powermode"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_RADIO, sizeof (dladm_wlan_radio_t), "wl_radio"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_ESS_LIST, sizeof (wl_ess_list_t), "wl_ess_list"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_KEY_TAB, sizeof (wl_wep_key_tab_t), "wl_wep_key"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_CREATE_IBSS, sizeof (wl_create_ibss_t), "createibss"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan /* wl_wpa_ie_t has variable length */
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_SETOPTIE, sizeof (wl_wpa_ie_t), "set_ie"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_DELKEY, sizeof (wl_del_key_t), "wpa_del_key"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_KEY, sizeof (wl_key_t), "wl_key"},
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan { MAC_PROP_WL_MLME, sizeof (wl_mlme_t), "mlme"},
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy { MAC_PROP_TAGMODE, sizeof (link_tagmode_t), "tagmode"},
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy { MAC_PROP_IPTUN_HOPLIMIT, sizeof (uint32_t), "hoplimit"},
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy { MAC_PROP_IPTUN_ENCAPLIMIT, sizeof (uint32_t), "encaplimit"},
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai { MAC_PROP_PVID, sizeof (uint16_t), "default_tag"},
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai { MAC_PROP_LLIMIT, sizeof (uint32_t), "learn_limit"},
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai { MAC_PROP_LDECAY, sizeof (uint32_t), "learn_decay"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_RESOURCE, sizeof (mac_resource_props_t), "resource"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_RESOURCE_EFF, sizeof (mac_resource_props_t),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource-effective"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_RXRINGSRANGE, sizeof (mac_propval_range_t), "rxrings"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_TXRINGSRANGE, sizeof (mac_propval_range_t), "txrings"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_MAX_TX_RINGS_AVAIL, sizeof (uint_t),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "txrings-available"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_MAX_RX_RINGS_AVAIL, sizeof (uint_t),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "rxrings-available"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_MAX_RXHWCLNT_AVAIL, sizeof (uint_t), "rxhwclnt-available"},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer { MAC_PROP_MAX_TXHWCLNT_AVAIL, sizeof (uint_t), "txhwclnt-available"},
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala { MAC_PROP_IB_LINKMODE, sizeof (uint32_t), "linkmode"},
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi { MAC_PROP_VN_PROMISC_FILTERED, sizeof (boolean_t), "promisc-filtered"},
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek { MAC_PROP_SECONDARY_ADDRS, sizeof (mac_secondary_addr_t),
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek "secondary-macs"},
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic const bridge_public_prop_t bridge_prop[] = {
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchistatic val_desc_t link_promisc_filtered_vals[] = {
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasamstatic val_desc_t dladm_part_linkmode_vals[] = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t))
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * For the default, if defaults are not defined for the property,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * pd_defval.vd_name should be null. If the driver has to be contacted for the
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * value, vd_name should be the empty string (""). Otherwise, dladm will
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * just print whatever is in the table.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_wlan_powermode_vals, VALCNT(dladm_wlan_powermode_vals),
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam { "linkmode", { "cm", DLADM_PART_CM_MODE },
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam dladm_part_linkmode_vals, VALCNT(dladm_part_linkmode_vals),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala set_public_prop, NULL, get_linkmode_prop, NULL, 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_autopush, check_autopush, PD_CHECK_ALLOC,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_zone, check_zone, PD_TEMPONLY|PD_CHECK_ALLOC,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_uint32, check_uint32, 0, DATALINK_CLASS_ALL,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems DATALINK_ANY_MEDIATYPE },
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek get_secondary_macs, check_secondary_macs, PD_CHECK_ALLOC,
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { "adv_10gfdx_cap", { "", 0 },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals),
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { "en_10gfdx_cap", { "", 0 },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals),
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer link_priority_vals, VALCNT(link_priority_vals), set_resource,
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy { "tagmode", { "vlanonly", LINK_TAGMODE_VLANONLY },
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy DATALINK_CLASS_PHYS | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer check_hoplimit, 0, DATALINK_CLASS_IPTUN, DATALINK_ANY_MEDIATYPE},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer check_encaplim, 0, DATALINK_CLASS_IPTUN, DL_IPV6},
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai set_bridge_forward, NULL, get_bridge_forward, NULL, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ALL & ~DATALINK_CLASS_VNIC, DL_ETHER },
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai set_bridge_pvid, NULL, get_bridge_pvid, check_bridge_pvid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai 0, DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR|
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai { "learn_limit", { "1000", 1000 }, NULL, 0,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, NULL, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai { "stp_priority", { "128", 128 }, NULL, 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, check_stp_prop, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, check_stp_prop, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, NULL, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, NULL, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_stp_prop, NULL, get_stp, check_stp_prop, PD_AFTER_PERM,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_resource, NULL, get_protection, check_prop, 0,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi link_promisc_filtered_vals, VALCNT(link_promisc_filtered_vals),
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi set_promisc_filtered, NULL, get_promisc_filtered, check_prop, 0,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_allowedips, check_allowedips, PD_CHECK_ALLOC,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer get_allowedcids, check_allowedcids, PD_CHECK_ALLOC,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_resource, get_rings_range, get_rxrings, check_rings, 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer set_resource, get_rings_range, get_txrings, check_rings, 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define DLADM_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define DLADM_MAX_RSRC_PROP (sizeof (rsrc_prop_table) / \
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * when retrieving private properties, we pass down a buffer with
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan * DLADM_PROP_BUF_CHUNK of space for the driver to return the property value.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *, char **, uint_t);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *, char **, uint_t *);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkinestatic dladm_status_t i_dladm_walk_linkprop_priv_db(dladm_handle_t,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine datalink_id_t, void *, int (*)(dladm_handle_t,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine datalink_id_t, const char *, void *));
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_class_t, uint32_t, prop_desc_t *, char **,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeystatic dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * rates to be retrieved. However, we cannot increase it at this
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * time because it will break binary compatibility with unbundled
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * WiFi drivers and utilities. So for now we define an additional
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved.
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (j = 0; j < val_cnt; j++) {
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng (void) memcpy(&vdp[j], &pdp->pd_optval[i], sizeof (val_desc_t));
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((flags & DLADM_OPT_PERSIST) && (pdp->pd_flags & PD_TEMPONLY))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, prop_val,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = check_prop(handle, pdp, linkid, prop_val,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((pdp->pd_flags & PD_CHECK_ALLOC) != 0 || defval) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((vdp = calloc(1, sizeof (val_desc_t))) == NULL)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_check(handle, pdp, linkid,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_getset_defval(handle, pdp, linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = (flags & DLADM_OPT_PERSIST) ? DLADM_STATUS_OK :
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < cnt; i++)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < DLADM_MAX_PROPS; i++) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey s = i_dladm_set_single_prop(handle, linkid, class, media, pdp,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini /* other private properties */
3361618b69459cc57ec852687200c4c3550ca822Rishi Srivatsavai status = i_dladm_set_private_prop(handle, linkid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Set/reset link property for specific link
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((linkid == DATALINK_INVALID_LINKID) || (flags == 0) ||
3361618b69459cc57ec852687200c4c3550ca822Rishi Srivatsavai * Check for valid link property against the flags passed
3361618b69459cc57ec852687200c4c3550ca822Rishi Srivatsavai * and set the link property when active flag is passed.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_set_linkprop_db(handle, linkid, prop_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status == DLADM_STATUS_OK && (flags & DLADM_OPT_ACTIVE)) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (i = 0; i < DLADM_MAX_PROPS; i++, pdp++) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, NULL,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * Walk all link properties of the given specific link.
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * Note: this function currently lacks the ability to walk _all_ private
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * properties if the link, because there is no kernel interface to
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * retrieve all known private property names. Once such an interface
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * is added, this function should be fixed accordingly.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey int (*func)(dladm_handle_t, datalink_id_t, const char *, void *))
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < DLADM_MAX_PROPS; i++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media))
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (func(handle, linkid, prop_table[i].pd_name, arg) ==
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine status = i_dladm_walk_linkprop_priv_db(handle, linkid, arg, func);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get linkprop of the given specific link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_prop_type_t type, const char *prop_name, char **prop_val,
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail else if (type == DLADM_PROP_VAL_MODIFIABLE)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < DLADM_MAX_PROPS; i++)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * private property.
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine return (i_dladm_get_linkprop_db(handle, linkid,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine return (i_dladm_get_priv_prop(handle, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (type) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems case DLADM_PROP_VAL_PERM:
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems if (pdp->pd_set == NULL) {
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems perm_flags = MAC_PROP_PERM_READ;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val,
13a55820e952b584554bc6b9d4e9303052a2cf29ar * If defaults are not defined for the property,
13a55820e952b584554bc6b9d4e9303052a2cf29ar * pd_defval.vd_name should be null. If the driver
13a55820e952b584554bc6b9d4e9303052a2cf29ar * has to be contacted for the value, vd_name should
13a55820e952b584554bc6b9d4e9303052a2cf29ar * be the empty string (""). Otherwise, dladm will
13a55820e952b584554bc6b9d4e9303052a2cf29ar * just print whatever is in the table.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_getmod(handle, pdp, linkid, prop_val,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems val_cntp, media, dld_flags, &perm_flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (cnt == 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < cnt; i++) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_get_linkprop_db(handle, linkid, prop_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Get linkprop of the given specific link and run any possible conversion
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * of the values using the check function for the property. Fails if the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * check function doesn't succeed for the property value.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaidladm_get_linkprop_values(dladm_handle_t handle, datalink_id_t linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_prop_type_t type, const char *prop_name, uint_t *ret_val,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL ||
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ret_val == NULL || val_cntp == NULL || *val_cntp == 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcasecmp(prop_name, pdp->pd_name) == 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media))
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai prop_val = malloc(*val_cntp * sizeof (*prop_val) +
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai prop_val[valc] = (char *)(prop_val + *val_cntp) +
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dld_flags = (type == DLADM_PROP_VAL_DEFAULT) ? DLD_PROP_DEFAULT : 0;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If defaults are not defined for the property,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * pd_defval.vd_name should be null. If the driver
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * has to be contacted for the value, vd_name should
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * be the empty string (""). Otherwise, dladm will
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * just print whatever is in the table.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = i_dladm_get_linkprop_db(handle, linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai vdp = malloc(sizeof (val_desc_t) * *val_cntp);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = pdp->pd_check(handle, pdp, linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*ARGSUSED*/
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < valcnt; i++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (char *) * DLADM_MAX_PROP_VALCNT +
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey prop_name, propvals, &valcnt) != DLADM_STATUS_OK) {
8d4cf8d8d2965ea43bccdc838f15c18634fee02d status = dladm_set_linkprop(handle, linkid, prop_name, propvals,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*ARGSUSED*/
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_init_linkprop(handle, linkid, B_TRUE);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid,
308903890e892f9c21ee582e3a52fdd67e52870bartem dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dla = malloc(sizeof (dladm_linkprop_args_t));
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_walk_linkprop(handle, linkid, (void *)dla,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX);
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef int (*zone_get_devroot_t)(char *, char *, size_t);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzi_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (-1);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (-1);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ret != 0) {
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems dzp = (dld_ioc_zid_t *)vdp->vd_val;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems zid_new = dzp->diz_zid;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((status = set_public_prop(handle, pdp, linkid, vdp, val_cnt,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * It is okay to fail to update the /dev entry (some vanity-named
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * links do not have a /dev entry).
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK;
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems dzp = malloc(sizeof (dld_ioc_zid_t));
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng zone_name = (prop_val != NULL) ? *prop_val : GLOBAL_ZONENAME;
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if ((zoneid = getzoneidbyname(zone_name)) == -1) {
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL;
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (zoneid != GLOBAL_ZONEID) {
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &flags,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (flags)) < 0) {
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems status = dladm_errno2status(errno);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL;
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems (void) memset(dzp, 0, sizeof (dld_ioc_zid_t));
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dzp;
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_bw2str(mrp.mrp_maxbw, prop_val[0]);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((*maxbw < MRP_MAXBW_MINVAL) && (*maxbw != 0)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_maxbw(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bcopy((char *)vdp->vd_val, &mrp->mrp_maxbw, sizeof (uint64_t));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pdp->pd_name, "cpus-effective") == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource-effective", flags, perm_flags, &mrp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource", flags, perm_flags, &mrp, sizeof (mrp));
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Sort CPU list and convert it to a mac_propval_range */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim status = dladm_list2range(mrp.mrp_cpu, mrp.mrp_ncpus,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Write CPU ranges and individual CPUs */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Get the current pool property */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Can't set cpus if a pool is set */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Read ranges and convert to mac_propval_range */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim status = dladm_strs2range(prop_val, val_cnt, MAC_PROPVAL_UINT32,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Convert mac_propval_range to a single CPU list */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim status = dladm_range2list(pv_range, cpus, &ncpus);
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim * If a range of CPUs was entered, update value count and reallocate
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim * the array of val_desc_t's. The array allocated was sized for
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim * indvidual elements, but needs to be reallocated to accomodate the
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim * expanded list of CPUs.
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim newvdp = calloc(*val_cntp, sizeof (val_desc_t));
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Check if all CPUs in the list are online */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim for (i = 0; i < ncpus; i++) {
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Check for duplicate CPUs */
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim for (i = 0; i < *val_cntp; i++) {
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim for (j = 0; j < *val_cntp; j++) {
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim /* Update *val_cntp and *vdpp if everything was OK */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_cpus(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < cnt; i++)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the pool datalink property from the kernel. This is used
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * for both the user specified pool and effective pool properties.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_pool(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pdp->pd_name, "pool-effective") == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource-effective", flags, perm_flags, &mrp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource", flags, perm_flags, &mrp, sizeof (mrp));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_pool(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Get the current cpus property */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Can't set pool if cpus are set */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Check for pool's availability if not booting */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Allocate and open pool configuration */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (pool_conf_open(poolconf, pool_dynamic_location(), PO_RDONLY)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Look for pool name */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((pool = pool_get_pool(poolconf, *prop_val)) == NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strlcpy(poolname, *prop_val, sizeof (mrp.mrp_pool));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_pool(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_resource_props_t *mrp = (mac_resource_props_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bzero(&mrp->mrp_pool, sizeof (mrp->mrp_pool));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strlcpy(mrp->mrp_pool, (char *)vdp->vd_val,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Use MCM_CPUS since the fanout count is not user specified
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * and will be determined by the cpu list generated from the
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_priority(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer pri = ((mrp.mrp_mask & MRP_PRIORITY) == 0) ? MPL_HIGH :
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_priority(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mrp->mrp_priority = (mac_priority_level_t)vdp->vd_val;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Determines the size of the structure that needs to be sent to drivers
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * for retrieving the property range values.
0591ddd0694c4d7ab3ad339419da215a732587f8Prakash Jalani_dladm_range_size(mac_propval_range_t *r, size_t *sz, uint_t *rcount)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *sz += (count * sizeof (mac_propval_uint32_range_t));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_rings(dladm_handle_t handle, prop_desc_t *pdp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strncasecmp(prop_val[0], "hw", strlen("hw")) == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (strncasecmp(prop_val[0], "sw", strlen("sw")) == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_rings_range(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_macprop(handle, dip, B_FALSE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer rangep = (mac_propval_range_t *)(void *)&dip->pr_val;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* This is the case where the dev doesn't have any rings/groups */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * This is the case where the dev supports rings, but static
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(prop_val[0], DLADM_PROP_VAL_MAX, "sw,hw");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * This is the case where the dev supports rings and dynamic
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * grouping, but has only one value (say 2 rings and 2 groups).
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(prop_val[0], DLADM_PROP_VAL_MAX, "sw,hw,%d",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * This is the case where the dev supports rings and dynamic
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * grouping and has a range of rings.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(prop_val[0], DLADM_PROP_VAL_MAX,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "sw,hw,<%ld-%ld>", ur->mpur_min, ur->mpur_max);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_rxrings(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the number of (effective-)rings from the resource property.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pdp->pd_name, "rxrings-effective") == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource-effective", flags, perm_flags, &mrp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the permissions from the "rxrings" property.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "rxrings",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource", flags, NULL, &mrp, sizeof (mrp));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "hw");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else if (nrings == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "sw");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", nrings);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_rxrings(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_resource_props_t *mrp = (mac_resource_props_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_txrings(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char **prop_val, uint_t *val_cnt, datalink_media_t media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the number of (effective-)rings from the resource property.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(pdp->pd_name, "txrings-effective") == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "resource-effective", flags, perm_flags, &mrp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the permissions from the "txrings" property.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "txrings",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Get the number of rings from the "resource" property.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "hw");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else if (nrings == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "sw");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", nrings);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_txrings(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_resource_props_t *mrp = (mac_resource_props_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_cntavail(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (get_uint32(handle, pdp, linkid, prop_val, val_cnt, media,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_resource(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dip = i_dladm_buf_alloc_by_name(0, linkid, "resource",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < DLADM_MAX_RSRC_PROP; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_macprop(handle, dip, B_TRUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_protection(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_find_setbits32(p->mp_types, setbits, &cnt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < cnt; i++)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_protect2str(setbits[i], prop_val[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_allowedips(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < p->mp_ipaddrcnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (p->mp_ipaddrs[i].ip_version == IPV4_VERSION) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer v4addr = V4_PART_OF_V6(p->mp_ipaddrs[i].ip_addr);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_ipv4addr2str(&v4addr, prop_val[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_ipv6addr2str(&p->mp_ipaddrs[i].ip_addr,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_protection(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < cnt; i++)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_allowedips(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bcopy((void *)vdp[i].vd_val, &p->mp_ipaddrs[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_single_ip(char *buf, mac_ipaddr_t *addr)
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * If the IP address is in CIDR format, parse the bits component
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * seperately. An address in this style will be used to indicate an
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * entire subnet, so it must be a network number with no host address.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer IN6_IPADDR_TO_V4MAPPED(v4addr, &addr->ip_addr);
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * Validate the netmask is in the proper range for v4
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * We have a CIDR style address, confirm that only the
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * network number is set.
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * Note that the address in our buffer is stored in
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi * network byte order.
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi for (i = 3; i >= 0; i--) {
e03914f9208eb53e6c8a6d5a436953ad983642b0Robert Mustacchi high = ffsl(ntohl(v6addr._S6_un._S6_u32[i]));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_allowedips(dladm_handle_t handle, prop_desc_t *pdp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < val_cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((addr = calloc(1, sizeof (mac_ipaddr_t))) == NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < val_cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bcopy(cid->dc_id, &duidtype, sizeof (duidtype));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer lladdr = _link_ntoa(cid->dc_id + sizeof (llt),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL, cid->dc_len - sizeof (llt), IFT_OTHER);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "%d.%d.%d.%s",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (octet_to_hexascii(cid->dc_id + sizeof (en),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer cid->dc_len - sizeof (en), tmp_buf, &hexlen) != 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "%d.%d.%s",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer lladdr = _link_ntoa(cid->dc_id + sizeof (ll),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "%d.%d.%s",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (octet_to_hexascii(cid->dc_id + sizeof (duidtype),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (octet_to_hexascii(cid->dc_id, cid->dc_len,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "0x%s", tmp_buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "%s", cid->dc_id);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, DLADM_STRSIZE, "<unknown>");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (duidtype != 0 && duidtype <= DHCPV6_DUID_LL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bcopy(lladdr, cid->dc_id + sizeof (llt), addrlen);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bcopy(lladdr, cid->dc_id + sizeof (ll), addrlen);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (strncasecmp("0x", ptr, 2) == 0 && ptr[2] != '\0') {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (hexascii_to_octet(ptr, strlen(ptr), tmp_buf,
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_allowedcids(dladm_handle_t handle, prop_desc_t *pdp,
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, "resource", flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (p->mp_cidcnt == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < p->mp_cidcnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextract_allowedcids(val_desc_t *vdp, uint_t cnt, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < cnt; i++) {
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_allowedcids(dladm_handle_t handle, prop_desc_t *pdp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim uint_t flags, val_desc_t **vdpp, datalink_media_t media)
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng for (i = 0; i < val_cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((cid = calloc(1, sizeof (mac_dhcpcid_t))) == NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < val_cnt; i++) {
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek/* ARGSUSED */
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinekget_secondary_macs(dladm_handle_t handle, prop_desc_t *pdp,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek datalink_media_t media, uint_t flags, uint_t *perm_flags)
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek (const unsigned char *)&sa.ms_addrs[i], prop_val[i]) ==
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek/* ARGSUSED */
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinekcheck_secondary_macs(dladm_handle_t handle, prop_desc_t *pdp,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek for (i = 0; i < val_cnt; i++) {
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek for (i = 0; i < val_cnt; i++) {
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek/* ARGSUSED */
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinekset_secondary_macs(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek dip = i_dladm_buf_alloc_by_name(0, linkid, "secondary-macs", 0,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek for (i = 0; i < val_cnt; i++) {
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek status = i_dladm_macprop(handle, dip, B_TRUE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems struct dlautopush dlap;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems for (i = 0, len = 0; i < dlap.dap_npush; i++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (i != 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) snprintf(*prop_val + len, DLADM_PROP_VAL_MAX - len,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems "%s", dlap.dap_aplist[i]);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems len += strlen(dlap.dap_aplist[i]);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (dlap.dap_anchor - 1 == i) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Add the specified module to the dlautopush structure; returns a
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * DLADM_STATUS_* code.
d62bc4badc1c1f1549c961cfb8b420e650e1272byzi_dladm_add_ap_module(const char *module, struct dlautopush *dlap)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((strlen(module) == 0) || (strlen(module) > FMNAMESZ))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strncasecmp(module, AP_ANCHOR, strlen(AP_ANCHOR)) == 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * We don't allow multiple anchors, and the anchor must
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * be after at least one module.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(dlap->dap_aplist[dlap->dap_npush++], module,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Currently, both '.' and ' '(space) can be used as the delimiters between
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * autopush modules. The former is used in dladm set-linkprop, and the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * latter is used in the autopush(1M) file.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (prop_val != NULL) {
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems dlap = malloc(sizeof (struct dlautopush));
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems (void) memset(dlap, 0, sizeof (struct dlautopush));
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems (void) snprintf(delimiters, 4, " %c\n", AP_DELIMITER);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems bcopy(*prop_val, val, DLADM_PROP_VAL_MAX);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems module = strtok(val, delimiters);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems while (module != NULL) {
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems status = i_dladm_add_ap_module(module, dlap);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK)
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems module = strtok(NULL, delimiters);
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dlap;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan#define WLDP_BUFSIZE (MAX_BUF_LEN - WIFI_BUF_OFFSET)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_rate_common(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems if (media != DL_WIFI) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (get_speed(handle, pdp, linkid, prop_val,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (get_rate_common(handle, pdp, linkid, prop_val, val_cnt,
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * Speed for ethernet links is unbounded. E.g., 802.11b
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * links can have a speed of 5.5 Gbps.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (get_rate_common(handle, pdp, linkid, prop_val,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_wlan_rate(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
6b9e797c2ea518518cb2b57895991d8bdaa167fesowmini val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
6b9e797c2ea518518cb2b57895991d8bdaa167fesowmini * can currently set rate on WIFI links only.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = set_wlan_rate(handle, linkid, &rates);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < MAX_SUPPORT_RATES; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = get_rate_mod(handle, NULL, linkid, modval, &modval_cnt,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < modval_cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_channel(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((status = get_phyconf(handle, linkid, buf, sizeof (buf)))
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan (void) memcpy(&wl_phy_conf, buf, sizeof (wl_phy_conf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!i_dladm_wlan_convert_chan(&wl_phy_conf, &channel))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_powermode(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz const char *s;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((status = i_dladm_wlan_param(handle, linkid, buf,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MAC_PROP_WL_POWER_MODE, sizeof (buf), B_FALSE)) != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz s = "off";
d62bc4badc1c1f1549c961cfb8b420e650e1272byz s = "max";
d62bc4badc1c1f1549c961cfb8b420e650e1272byz s = "fast";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_powermode(dladm_handle_t handle, prop_desc_t *pdp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_wlan_powermode_t powermode = vdp->vd_val;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &ps_mode,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_radio(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz const char *s;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((status = i_dladm_wlan_param(handle, linkid, buf,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MAC_PROP_WL_RADIO, sizeof (buf), B_FALSE)) != DLADM_STATUS_OK)
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan (void) memcpy(&radio, buf, sizeof (radio));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (radio) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz s = "off";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_radio(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan sizeof (r), B_TRUE));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_hoplimit(dladm_handle_t handle, prop_desc_t *pdp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (errno != 0 || ep == *prop_val || hlim < 1 ||
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_encaplim(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim char **prop_val, uint_t *val_cntp, uint_t flags, val_desc_t **vdpp,
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (errno != 0 || ep == *prop_val || elim < 0 ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * reset case.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (val_cnt == 0) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_unset_conf_field(handle, conf, prop_name);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < val_cnt; i++) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cntp)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_getsnap_conf(handle, linkid, &conf);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(prop_val[cnt++], str, DLADM_PROP_VAL_MAX);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * Walk persistent private link properties of a link.
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkinei_dladm_walk_linkprop_priv_db(dladm_handle_t handle, datalink_id_t linkid,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine void *arg, int (*func)(dladm_handle_t, datalink_id_t, const char *, void *))
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine if (linkid == DATALINK_INVALID_LINKID || func == NULL)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_getsnap_conf(handle, linkid, &conf);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine while ((status = dladm_getnext_conf_linkprop(handle, conf, last_attr,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine attr, attrval, MAXLINKATTRVALLEN, &attrsz)) == DLADM_STATUS_OK) {
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine (void) strlcpy(last_attr, attr, MAXLINKATTRLEN);
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) {
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini return (p);
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) {
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhani_dladm_buf_alloc_impl(size_t valsize, datalink_id_t linkid,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan const char *prop_name, mac_prop_id_t propid, uint_t flags,
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini (void) strlcpy(dip->pr_name, prop_name, sizeof (dip->pr_name));
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhani_dladm_buf_alloc_by_name(size_t valsize, datalink_id_t linkid,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan const char *prop_name, uint_t flags, dladm_status_t *status)
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, prop_name, p->pp_id,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhani_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan mac_prop_id_t propid, uint_t flags, dladm_status_t *status)
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, p->pp_name, propid,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerset_public_prop(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 0, &status);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * Currently all 1/2/4-byte size properties are byte/word/int.
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * No need (yet) to distinguish these from arrays of same size.
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems (void) memcpy(dip->pr_val, val, dip->pr_valsize);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip))
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *prop_name, uint_t flags, uint_t *perm_flags, void *arg, size_t size)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dip = i_dladm_buf_alloc_by_name(0, linkid, prop_name, flags, &status);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_macprop(handle, dip, B_FALSE);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercheck_uint32(dladm_handle_t handle, prop_desc_t *pdp,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai v->vd_val = strtoul(prop_val[0], NULL, 0);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_duplex(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex",
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_speed(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed",
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_link_state(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = dladm_get_state(handle, linkid, &link_state);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_binary(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer perm_flags, &v, sizeof (v));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%d", (uint_t)(v > 0));
6b9e797c2ea518518cb2b57895991d8bdaa167fesowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_uint32(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer perm_flags, &v, sizeof (v));
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", v);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_range(dladm_handle_t handle, prop_desc_t *pdp,
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail datalink_media_t media, uint_t flags, uint_t *perm_flags)
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail * As caller we don't know number of value ranges, the driver
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail * supports. To begin with we assume that number to be 1. If the
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail * buffer size is insufficient, driver returns back with the
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail * actual count of value ranges. See mac.h for more details.
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags,
0591ddd0694c4d7ab3ad339419da215a732587f8Prakash Jalan rangep = (mac_propval_range_t *)(void *)&dip->pr_val;
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail status = i_dladm_macprop(handle, dip, B_FALSE);
0591ddd0694c4d7ab3ad339419da215a732587f8Prakash Jalan if ((err = i_dladm_range_size(rangep, &sz, &rcount))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(prop_val[0], DLADM_PROP_VAL_MAX, "--");
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX,
f0f2c3a5cf65a61de34af42edac38b2a7bda3416Girish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX,
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_tagmode(dladm_handle_t handle, prop_desc_t *pdp,
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy (void) strlcpy(*prop_val, "normal", DLADM_PROP_VAL_MAX);
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy (void) strlcpy(*prop_val, "vlanonly", DLADM_PROP_VAL_MAX);
e75f0919bf9ec317db5c7166d0aaf1eed11debdbSebastien Roy (void) strlcpy(*prop_val, "unknown", DLADM_PROP_VAL_MAX);
6b9e797c2ea518518cb2b57895991d8bdaa167fesowmini/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_flowctl(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer perm_flags, &v, sizeof (v));
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini switch (v) {
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini/* ARGSUSED */
3361618b69459cc57ec852687200c4c3550ca822Rishi Srivatsavaii_dladm_set_private_prop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * private properties: all parsing is done in the kernel.
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * allocate a enough space for each property + its separator (',').
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini for (i = 0; i < val_cnt; i++) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * getting default value. so use more buffer space.
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan dip = i_dladm_buf_alloc_by_name(bufsize + 1, linkid, prop_name,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (prop_val != NULL ? 0 : DLD_PROP_DEFAULT), &status);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_macprop(handle, dip, B_FALSE);
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini for (i = 0; i < val_cnt; i++) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * add a "," separator and update dp.
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine status = i_dladm_macprop(handle, dip, B_TRUE);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkinei_dladm_get_priv_prop(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cnt,
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini * private properties: all parsing is done in the kernel.
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan dip = i_dladm_buf_alloc_by_name(DLADM_PROP_BUF_CHUNK, linkid, prop_name,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = i_dladm_macprop(handle, dip, B_FALSE)) ==
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems if (type == DLADM_PROP_VAL_PERM) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) dladm_perm2str(dip->pr_perm_flags, *prop_val);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine } else if (type == DLADM_PROP_VAL_MODIFIABLE) {
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems (void) strncpy(*prop_val, dip->pr_val,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine } else if ((status == DLADM_STATUS_NOTSUP) &&
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid, datalink_media_t media, uint_t flags)
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * Allocate buffer needed for prop_vals array. We can have at most
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * DLADM_MAX_PROP_VALCNT char *prop_vals[] entries, where
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini * each entry has max size DLADM_PROP_VAL_MAX
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini (sizeof (char *) + DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT;
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) {
4045d94132614e1de2073685a6cdd4fbd86bec33sowmini sizeof (char *) * DLADM_MAX_PROP_VALCNT +
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * For properties which have pdp->pd_defval.vd_name as a non-empty
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * string, the "" itself is used to reset the property (exceptions
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * are zone and autopush, which populate vdp->vd_val). So
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * libdladm can copy pdp->pd_defval over to the val_desc_t passed
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * down on the setprop using the global values in the table. For
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * other cases (vd_name is ""), doing reset-linkprop will cause
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * libdladm to do a getprop to find the default value and then do
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems * a setprop to reset the value to default.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media,
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems if (perm_flags == MAC_PROP_PERM_RW) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_set_single_prop(handle, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey pdp->pd_class, media, pdp, prop_vals, cnt, flags);
afdda45f890ee5dfc86e5131a30b11b354d51633Vasumathi Sundaram - Sun Microsystems status = DLADM_STATUS_NOTSUP;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_stp(dladm_handle_t handle, struct prop_desc *pd, datalink_id_t linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (bpp = bridge_prop; bpp->bpp_name != NULL; bpp++)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcmp(bpp->bpp_name, pd->pd_name) == 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai retv = dladm_bridge_get_port_cfg(handle, linkid, bpp->bpp_code, &val);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* If the daemon isn't running, then return the persistent value */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (val == pd->pd_defval.vd_val && pd->pd_defval.vd_name[0] != '\0') {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_optval[i].vd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", (unsigned)val);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/* ARGSUSED1 */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiset_stp_prop(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Special case for mcheck: the daemon resets the value to zero, and we
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * don't want the daemon to refresh itself; it leads to deadlock.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Tell the running daemon, if any */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (dladm_bridge_refresh(handle, linkid));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * This is used only for stp_priority, stp_cost, and stp_mcheck.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicheck_stp_prop(dladm_handle_t handle, struct prop_desc *pd,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Only stp_priority and stp_cost use this function */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai iscost = strcmp(pd->pd_name, "stp_cost") == 0;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (iscost && strcmp(prop_val[0], "auto") == 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Illegal value 0 is allowed to mean "automatic" */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (vdp->vd_val > 65535 ? DLADM_STATUS_BADVAL :
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If the user is setting stp_mcheck non-zero, then (per the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * IEEE management standards and UNH testing) we need to check
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * whether this link is part of a bridge that is running RSTP.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If it's not, then setting the flag is an error. Note that
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * errors are intentionally discarded here; it's the value
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * that's the problem -- it's not a bad value, merely one that
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * can't be used now.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (strcmp(pd->pd_name, "stp_mcheck") == 0 &&
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (dladm_bridge_getlink(handle, linkid, bridge,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiget_bridge_forward(dladm_handle_t handle, struct prop_desc *pd,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai retv = dladm_bridge_get_forwarding(handle, linkid, &val);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", val);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiset_bridge_forward(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Tell the running daemon, if any */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (dladm_bridge_refresh(handle, linkid));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiget_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = i_dladm_macprop(handle, dip, B_FALSE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) memcpy(&pvid, dip->pr_val, sizeof (pvid));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", pvid);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiset_bridge_pvid(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) memcpy(dip->pr_val, &pvid, sizeof (pvid));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = i_dladm_macprop(handle, dip, B_TRUE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Tell the running daemon, if any */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (dladm_bridge_refresh(handle, linkid));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaicheck_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd,
c569ef53f93f66348bf56b8063df5b58dbcb3430Michael Lim datalink_id_t linkid, char **prop_val, uint_t *val_cntp, uint_t flags,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (vdp->vd_val > VLAN_ID_MAX ? DLADM_STATUS_BADVAL :
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey mac_prop_id_t cmd, size_t len, boolean_t set)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan if (len == (MAX_BUF_LEN - WIFI_BUF_OFFSET))
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan len = MAX_BUF_LEN - sizeof (dld_ioc_macprop_t) - 1;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan dip = i_dladm_buf_alloc_by_id(len, linkid, cmd, 0, &status);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_macprop(handle, dip, set);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues)
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine return (dladm_parse_args(str, listp, novalues));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Retrieve the one link property from the database
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * it is fine to point to prop_name since prop_name points to the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * prop_table[n].pd_name.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Retrieve all link properties for a link from the database and
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * return a property list.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_walk_linkprop(handle, linkid, list,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Retrieve the named property from a proplist, check the value and
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * convert to a kernel structure.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_link_proplist_extract_one(dladm_handle_t handle,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_arg_list_t *proplist, const char *name, uint_t flags, void *arg)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* Find named property in proplist */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* Property not in list */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < DLADM_MAX_PROPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vdp = malloc(sizeof (val_desc_t) * aip->ai_count);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* Check property value */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = pdp->pd_check(handle, pdp, 0, aip->ai_val,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (j = 0; j < DLADM_MAX_RSRC_PROP; j++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* Extract kernel structure */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Extract properties from a proplist and convert to mac_resource_props_t.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist,
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng for (i = 0; i < DLADM_MAX_RSRC_PROP; i++) {
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng status = i_dladm_link_proplist_extract_one(handle,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer proplist, rsrc_prop_table[i].rp_name, flags, mrp);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic const char *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ((perm & MAC_PROP_PERM_WRITE) != 0) ? 'w' : '-');
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdladm_get_state(dladm_handle_t handle, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (i_dladm_get_public_prop(handle, linkid, "state", 0,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine /* non-property attribute names */
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine /* dlmgmtd core attributes */
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine /* other attributes for vlan, aggr, etc */
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine for (i = 0; i < sizeof (nonprop) / sizeof (nonprop[0]); i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdladm_linkprop_is_set(dladm_handle_t handle, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_prop_type_t type, const char *prop_name, boolean_t *is_set)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan bufsize = (sizeof (char *) + DLADM_PROP_VAL_MAX) *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < valcnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer sizeof (char *) * DLADM_MAX_PROP_VALCNT +
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (dladm_get_linkprop(handle, linkid, type, prop_name, propvals,
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan * valcnt is always set to 1 by get_pool(), hence we need to check
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * for a non-null string to see if it is set. For protection,
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * secondary-macs and allowed-ips, we can check either the *propval
1a41ca239310955ae95b2569b707432432a58580Jerry Jelinek * or the valcnt.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if ((strcmp(prop_name, "cpus") == 0) && (valcnt != 0)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if ((strcmp(prop_name, "_softmac") == 0) && (valcnt != 0) &&
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaget_linkmode_prop(dladm_handle_t handle, prop_desc_t *pdp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_media_t media, uint_t flags, uint_t *perm_flags)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala perm_flags, &v, sizeof (v));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(prop_val[0], DLADM_STRSIZE, "%s", s);
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchiget_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi datalink_media_t media, uint_t flags, uint_t *perm_flags)
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi (void) snprintf(prop_val[0], DLADM_STRSIZE, "%s", s);
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi/* ARGSUSED */
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchiset_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name,
10a404923096d60a26c785c3cee15a5c364d51c0Robert Mustacchi (void) memcpy(dip->pr_val, &vdp->vd_val, dip->pr_valsize);