10ba2cbe9Sxc151355 /* 20ba2cbe9Sxc151355 * CDDL HEADER START 30ba2cbe9Sxc151355 * 40ba2cbe9Sxc151355 * The contents of this file are subject to the terms of the 50ba2cbe9Sxc151355 * Common Development and Distribution License (the "License"). 60ba2cbe9Sxc151355 * You may not use this file except in compliance with the License. 70ba2cbe9Sxc151355 * 80ba2cbe9Sxc151355 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90ba2cbe9Sxc151355 * or http://www.opensolaris.org/os/licensing. 100ba2cbe9Sxc151355 * See the License for the specific language governing permissions 110ba2cbe9Sxc151355 * and limitations under the License. 120ba2cbe9Sxc151355 * 130ba2cbe9Sxc151355 * When distributing Covered Code, include this CDDL HEADER in each 140ba2cbe9Sxc151355 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150ba2cbe9Sxc151355 * If applicable, add the following below this CDDL HEADER, with the 160ba2cbe9Sxc151355 * fields enclosed by brackets "[]" replaced with your own identifying 170ba2cbe9Sxc151355 * information: Portions Copyright [yyyy] [name of copyright owner] 180ba2cbe9Sxc151355 * 190ba2cbe9Sxc151355 * CDDL HEADER END 200ba2cbe9Sxc151355 */ 210ba2cbe9Sxc151355 /* 22e75f0919SSebastien Roy * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 230ba2cbe9Sxc151355 * Use is subject to license terms. 240ba2cbe9Sxc151355 */ 250ba2cbe9Sxc151355 260ba2cbe9Sxc151355 #include <stdlib.h> 270ba2cbe9Sxc151355 #include <strings.h> 280ba2cbe9Sxc151355 #include <errno.h> 290ba2cbe9Sxc151355 #include <ctype.h> 30d62bc4baSyz147064 #include <stddef.h> 31f4b3ec61Sdh155122 #include <sys/types.h> 320ba2cbe9Sxc151355 #include <sys/stat.h> 33f4b3ec61Sdh155122 #include <sys/dld.h> 34f4b3ec61Sdh155122 #include <sys/zone.h> 35f4b3ec61Sdh155122 #include <fcntl.h> 36f4b3ec61Sdh155122 #include <unistd.h> 37f4b3ec61Sdh155122 #include <libdevinfo.h> 38f4b3ec61Sdh155122 #include <zone.h> 39f595a68aSyz147064 #include <libdllink.h> 400ba2cbe9Sxc151355 #include <libdladm_impl.h> 41d62bc4baSyz147064 #include <libdlwlan_impl.h> 42f595a68aSyz147064 #include <libdlwlan.h> 43d62bc4baSyz147064 #include <libdlvlan.h> 44da14cebeSEric Cheng #include <libdlvnic.h> 45da14cebeSEric Cheng #include <libintl.h> 46f4b3ec61Sdh155122 #include <dlfcn.h> 47f4b3ec61Sdh155122 #include <link.h> 48d62bc4baSyz147064 #include <inet/wifi_ioctl.h> 49e7801d59Ssowmini #include <libdladm.h> 50da14cebeSEric Cheng #include <libdlstat.h> 51e7801d59Ssowmini #include <sys/param.h> 52da14cebeSEric Cheng #include <sys/debug.h> 53da14cebeSEric Cheng #include <sys/dld.h> 54da14cebeSEric Cheng #include <sys/mac_flow.h> 55e7801d59Ssowmini #include <inttypes.h> 56e7801d59Ssowmini #include <sys/ethernet.h> 57bcb5c89dSSowmini Varadhan #include <net/wpa.h> 58bcb5c89dSSowmini Varadhan #include <sys/sysmacros.h> 59f4b3ec61Sdh155122 60d62bc4baSyz147064 /* 61d62bc4baSyz147064 * The linkprop get() callback. 62da14cebeSEric Cheng * - pd: pointer to the prop_desc_t 63d62bc4baSyz147064 * - propstrp: a property string array to keep the returned property. 64d62bc4baSyz147064 * Caller allocated. 65d62bc4baSyz147064 * - cntp: number of returned properties. 66d62bc4baSyz147064 * Caller also uses it to indicate how many it expects. 67d62bc4baSyz147064 */ 68e7801d59Ssowmini struct prop_desc; 69da14cebeSEric Cheng typedef struct prop_desc prop_desc_t; 70e7801d59Ssowmini 714ac67f02SAnurag S. Maskey typedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp, 726b9e797cSsowmini datalink_id_t, char **propstp, uint_t *cntp, 73afdda45fSVasumathi Sundaram - Sun Microsystems datalink_media_t, uint_t, uint_t *); 74f4b3ec61Sdh155122 75d62bc4baSyz147064 /* 76d62bc4baSyz147064 * The linkprop set() callback. 77d62bc4baSyz147064 * - propval: a val_desc_t array which keeps the property values to be set. 78d62bc4baSyz147064 * - cnt: number of properties to be set. 79e7801d59Ssowmini * - flags: additional flags passed down the system call. 80e7801d59Ssowmini * 81e7801d59Ssowmini * pd_set takes val_desc_t given by pd_check(), translates it into 82e7801d59Ssowmini * a format suitable for kernel consumption. This may require allocation 83e7801d59Ssowmini * of ioctl buffers etc. pd_set() may call another common routine (used 84e7801d59Ssowmini * by all other pd_sets) which invokes the ioctl. 85d62bc4baSyz147064 */ 864ac67f02SAnurag S. Maskey typedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t, 876b9e797cSsowmini val_desc_t *propval, uint_t cnt, uint_t flags, 886b9e797cSsowmini datalink_media_t); 89f4b3ec61Sdh155122 90d62bc4baSyz147064 /* 91d62bc4baSyz147064 * The linkprop check() callback. 92d62bc4baSyz147064 * - propstrp: property string array which keeps the property to be checked. 93d62bc4baSyz147064 * - cnt: number of properties. 94d62bc4baSyz147064 * - propval: return value; the property values of the given property strings. 95e7801d59Ssowmini * 96e7801d59Ssowmini * pd_check checks that the input values are valid. It does so by 97e7801d59Ssowmini * iteraring through the pd_modval list for the property. If 98e7801d59Ssowmini * the modifiable values cannot be expressed as a list, a pd_check 99e7801d59Ssowmini * specific to this property can be used. If the input values are 100e7801d59Ssowmini * verified to be valid, pd_check allocates a val_desc_t and fills it 101e7801d59Ssowmini * with either a val_desc_t found on the pd_modval list or something 102e7801d59Ssowmini * generated on the fly. 103d62bc4baSyz147064 */ 1044ac67f02SAnurag S. Maskey typedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp, 1054ac67f02SAnurag S. Maskey datalink_id_t, char **propstrp, uint_t cnt, 1064ac67f02SAnurag S. Maskey val_desc_t *propval, datalink_media_t); 107f4b3ec61Sdh155122 108bcb5c89dSSowmini Varadhan typedef struct link_attr_s { 1093fd94f8cSam223141 mac_prop_id_t pp_id; 110e7801d59Ssowmini size_t pp_valsize; 111e7801d59Ssowmini char *pp_name; 112bcb5c89dSSowmini Varadhan } link_attr_t; 113e7801d59Ssowmini 114bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t, 115bcb5c89dSSowmini Varadhan const char *, uint_t, dladm_status_t *); 116bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t, 117da14cebeSEric Cheng mac_prop_id_t, uint_t, dladm_status_t *); 1184ac67f02SAnurag S. Maskey static dld_ioc_macprop_t *i_dladm_get_public_prop(dladm_handle_t, datalink_id_t, 1194ac67f02SAnurag S. Maskey char *, uint_t, dladm_status_t *, uint_t *); 120da14cebeSEric Cheng 121*3361618bSRishi Srivatsavai static dladm_status_t i_dladm_set_private_prop(dladm_handle_t, datalink_id_t, 1224ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 12362ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_get_priv_prop(dladm_handle_t, datalink_id_t, 1244ac67f02SAnurag S. Maskey const char *, char **, uint_t *, dladm_prop_type_t, 1254ac67f02SAnurag S. Maskey uint_t); 126bcb5c89dSSowmini Varadhan static link_attr_t *dladm_name2prop(const char *); 127bcb5c89dSSowmini Varadhan static link_attr_t *dladm_id2prop(mac_prop_id_t); 128da14cebeSEric Cheng 129d62bc4baSyz147064 static pd_getf_t do_get_zone, do_get_autopush, do_get_rate_mod, 130d62bc4baSyz147064 do_get_rate_prop, do_get_channel_prop, 131e7801d59Ssowmini do_get_powermode_prop, do_get_radio_prop, 1323bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_duplex_get, i_dladm_status_get, 1333bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_binary_get, i_dladm_uint32_get, 13462ee1d25SArtem Kachitchkine i_dladm_flowctl_get, i_dladm_maxbw_get, 135e75f0919SSebastien Roy i_dladm_cpus_get, i_dladm_priority_get, 136f0f2c3a5SGirish Moodalbail i_dladm_tagmode_get, i_dladm_range_get; 137da14cebeSEric Cheng 1383bc21d0aSAruna Ramakrishna - Sun Microsystems static pd_setf_t do_set_zone, do_set_rate_prop, 139e7801d59Ssowmini do_set_powermode_prop, do_set_radio_prop, 140da14cebeSEric Cheng i_dladm_set_public_prop, do_set_res, do_set_cpus; 141f4b3ec61Sdh155122 142da14cebeSEric Cheng static pd_checkf_t do_check_zone, do_check_autopush, do_check_rate, 143da14cebeSEric Cheng i_dladm_defmtu_check, do_check_maxbw, do_check_cpus, 144da14cebeSEric Cheng do_check_priority; 145da14cebeSEric Cheng 1464ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_speed_get(dladm_handle_t, prop_desc_t *, 1474ac67f02SAnurag S. Maskey datalink_id_t, char **, uint_t *, uint_t, uint_t *); 1484ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_wlan_get_legacy_ioctl(dladm_handle_t, 1494ac67f02SAnurag S. Maskey datalink_id_t, void *, uint_t, uint_t); 1504ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_wlan_set_legacy_ioctl(dladm_handle_t, 1514ac67f02SAnurag S. Maskey datalink_id_t, void *, uint_t, uint_t); 1524ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t); 153da14cebeSEric Cheng static const char *dladm_perm2str(uint_t, char *); 1546b9e797cSsowmini 155da14cebeSEric Cheng struct prop_desc { 156d62bc4baSyz147064 /* 157d62bc4baSyz147064 * link property name 158d62bc4baSyz147064 */ 159f4b3ec61Sdh155122 char *pd_name; 160d62bc4baSyz147064 161d62bc4baSyz147064 /* 162d62bc4baSyz147064 * default property value, can be set to { "", NULL } 163d62bc4baSyz147064 */ 164f4b3ec61Sdh155122 val_desc_t pd_defval; 165d62bc4baSyz147064 166d62bc4baSyz147064 /* 167d62bc4baSyz147064 * list of optional property values, can be NULL. 168d62bc4baSyz147064 * 169d62bc4baSyz147064 * This is set to non-NULL if there is a list of possible property 170d62bc4baSyz147064 * values. pd_optval would point to the array of possible values. 171d62bc4baSyz147064 */ 172d62bc4baSyz147064 val_desc_t *pd_optval; 173d62bc4baSyz147064 174d62bc4baSyz147064 /* 175d62bc4baSyz147064 * count of the above optional property values. 0 if pd_optval is NULL. 176d62bc4baSyz147064 */ 177d62bc4baSyz147064 uint_t pd_noptval; 178d62bc4baSyz147064 179d62bc4baSyz147064 /* 180d62bc4baSyz147064 * callback to set link property; 181d62bc4baSyz147064 * set to NULL if this property is read-only 182d62bc4baSyz147064 */ 183f4b3ec61Sdh155122 pd_setf_t *pd_set; 184d62bc4baSyz147064 185d62bc4baSyz147064 /* 186d62bc4baSyz147064 * callback to get modifiable link property 187d62bc4baSyz147064 */ 188f4b3ec61Sdh155122 pd_getf_t *pd_getmod; 189d62bc4baSyz147064 190d62bc4baSyz147064 /* 191d62bc4baSyz147064 * callback to get current link property 192d62bc4baSyz147064 */ 193f4b3ec61Sdh155122 pd_getf_t *pd_get; 194d62bc4baSyz147064 195d62bc4baSyz147064 /* 196d62bc4baSyz147064 * callback to validate link property value, set to NULL if pd_optval 197d62bc4baSyz147064 * is not NULL. In that case, validate the value by comparing it with 198d62bc4baSyz147064 * the pd_optval. Return a val_desc_t array pointer if the value is 199d62bc4baSyz147064 * valid. 200d62bc4baSyz147064 */ 201f4b3ec61Sdh155122 pd_checkf_t *pd_check; 202d62bc4baSyz147064 203d62bc4baSyz147064 uint_t pd_flags; 204e7801d59Ssowmini #define PD_TEMPONLY 0x1 /* property is temporary only */ 205e7801d59Ssowmini #define PD_CHECK_ALLOC 0x2 /* alloc vd_val as part of pd_check */ 206d62bc4baSyz147064 /* 207d62bc4baSyz147064 * indicate link classes this property applies to. 208d62bc4baSyz147064 */ 209d62bc4baSyz147064 datalink_class_t pd_class; 210d62bc4baSyz147064 211d62bc4baSyz147064 /* 212d62bc4baSyz147064 * indicate link media type this property applies to. 213d62bc4baSyz147064 */ 214d62bc4baSyz147064 datalink_media_t pd_dmedia; 215da14cebeSEric Cheng }; 216f4b3ec61Sdh155122 2173fd94f8cSam223141 #define MAC_PROP_BUFSIZE(v) sizeof (dld_ioc_macprop_t) + (v) - 1 218e7801d59Ssowmini 219bcb5c89dSSowmini Varadhan /* 220bcb5c89dSSowmini Varadhan * Supported link properties enumerated in the prop_table[] array are 221bcb5c89dSSowmini Varadhan * computed using the callback functions in that array. To compute the 222bcb5c89dSSowmini Varadhan * property value, multiple distinct system calls may be needed (e.g., 223bcb5c89dSSowmini Varadhan * for wifi speed, we need to issue system calls to get desired/supported 224bcb5c89dSSowmini Varadhan * rates). The link_attr[] table enumerates the interfaces to the kernel, 225bcb5c89dSSowmini Varadhan * and the type/size of the data passed in the user-kernel interface. 226bcb5c89dSSowmini Varadhan */ 227bcb5c89dSSowmini Varadhan static link_attr_t link_attr[] = { 228bcb5c89dSSowmini Varadhan { MAC_PROP_DUPLEX, sizeof (link_duplex_t), "duplex"}, 229e7801d59Ssowmini 230bcb5c89dSSowmini Varadhan { MAC_PROP_SPEED, sizeof (uint64_t), "speed"}, 231e7801d59Ssowmini 232bcb5c89dSSowmini Varadhan { MAC_PROP_STATUS, sizeof (link_state_t), "state"}, 233e7801d59Ssowmini 234bcb5c89dSSowmini Varadhan { MAC_PROP_AUTONEG, sizeof (uint8_t), "adv_autoneg_cap"}, 235e7801d59Ssowmini 236bcb5c89dSSowmini Varadhan { MAC_PROP_MTU, sizeof (uint32_t), "mtu"}, 237e7801d59Ssowmini 238bcb5c89dSSowmini Varadhan { MAC_PROP_FLOWCTRL, sizeof (link_flowctrl_t), "flowctrl"}, 239e7801d59Ssowmini 240bcb5c89dSSowmini Varadhan { MAC_PROP_ZONE, sizeof (dld_ioc_zid_t), "zone"}, 241e7801d59Ssowmini 242bcb5c89dSSowmini Varadhan { MAC_PROP_AUTOPUSH, sizeof (struct dlautopush), "autopush"}, 2433bc21d0aSAruna Ramakrishna - Sun Microsystems 244aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_ADV_10GFDX_CAP, sizeof (uint8_t), "adv_10gfdx_cap"}, 245aca118b7Slucy wang - Sun Microsystems - Beijing China 246aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_EN_10GFDX_CAP, sizeof (uint8_t), "en_10gfdx_cap"}, 247aca118b7Slucy wang - Sun Microsystems - Beijing China 248bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000FDX_CAP, sizeof (uint8_t), "adv_1000fdx_cap"}, 2493bc21d0aSAruna Ramakrishna - Sun Microsystems 250bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000FDX_CAP, sizeof (uint8_t), "en_1000fdx_cap"}, 251e7801d59Ssowmini 252bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000HDX_CAP, sizeof (uint8_t), "adv_1000hdx_cap"}, 253e7801d59Ssowmini 254bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000HDX_CAP, sizeof (uint8_t), "en_1000hdx_cap"}, 255e7801d59Ssowmini 256bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100FDX_CAP, sizeof (uint8_t), "adv_100fdx_cap"}, 257e7801d59Ssowmini 258bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100FDX_CAP, sizeof (uint8_t), "en_100fdx_cap"}, 259e7801d59Ssowmini 260bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100HDX_CAP, sizeof (uint8_t), "adv_100hdx_cap"}, 261e7801d59Ssowmini 262bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100HDX_CAP, sizeof (uint8_t), "en_100hdx_cap"}, 263e7801d59Ssowmini 264bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10FDX_CAP, sizeof (uint8_t), "adv_10fdx_cap"}, 265e7801d59Ssowmini 266bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10FDX_CAP, sizeof (uint8_t), "en_10fdx_cap"}, 267e7801d59Ssowmini 268bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10HDX_CAP, sizeof (uint8_t), "adv_10hdx_cap"}, 269e7801d59Ssowmini 270bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10HDX_CAP, sizeof (uint8_t), "en_10hdx_cap"}, 271e7801d59Ssowmini 272bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESSID, sizeof (wl_linkstatus_t), "essid"}, 273e7801d59Ssowmini 274bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSID, sizeof (wl_bssid_t), "bssid"}, 275bcb5c89dSSowmini Varadhan 276bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSTYPE, sizeof (wl_bss_type_t), "bsstype"}, 277bcb5c89dSSowmini Varadhan 278bcb5c89dSSowmini Varadhan { MAC_PROP_WL_LINKSTATUS, sizeof (wl_linkstatus_t), "wl_linkstatus"}, 279bcb5c89dSSowmini Varadhan 280bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 281bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DESIRED_RATES, sizeof (wl_rates_t), "desired_rates"}, 282bcb5c89dSSowmini Varadhan 283bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 284bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SUPPORTED_RATES, sizeof (wl_rates_t), "supported_rates"}, 285bcb5c89dSSowmini Varadhan 286bcb5c89dSSowmini Varadhan { MAC_PROP_WL_AUTH_MODE, sizeof (wl_authmode_t), "authmode"}, 287bcb5c89dSSowmini Varadhan 288bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ENCRYPTION, sizeof (wl_encryption_t), "encryption"}, 289bcb5c89dSSowmini Varadhan 290bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RSSI, sizeof (wl_rssi_t), "signal"}, 291bcb5c89dSSowmini Varadhan 292bcb5c89dSSowmini Varadhan { MAC_PROP_WL_PHY_CONFIG, sizeof (wl_phy_conf_t), "phy_conf"}, 293bcb5c89dSSowmini Varadhan 294bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CAPABILITY, sizeof (wl_capability_t), "capability"}, 295bcb5c89dSSowmini Varadhan 296bcb5c89dSSowmini Varadhan { MAC_PROP_WL_WPA, sizeof (wl_wpa_t), "wpa"}, 297bcb5c89dSSowmini Varadhan 298bcb5c89dSSowmini Varadhan /* wl_wpa_ess_t has variable length */ 299bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SCANRESULTS, sizeof (wl_wpa_ess_t), "scan_results"}, 300bcb5c89dSSowmini Varadhan 301bcb5c89dSSowmini Varadhan { MAC_PROP_WL_POWER_MODE, sizeof (wl_ps_mode_t), "powermode"}, 302bcb5c89dSSowmini Varadhan 303bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RADIO, sizeof (dladm_wlan_radio_t), "wl_radio"}, 304bcb5c89dSSowmini Varadhan 305bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESS_LIST, sizeof (wl_ess_list_t), "wl_ess_list"}, 306bcb5c89dSSowmini Varadhan 307bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY_TAB, sizeof (wl_wep_key_tab_t), "wl_wep_key"}, 308bcb5c89dSSowmini Varadhan 309bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CREATE_IBSS, sizeof (wl_create_ibss_t), "createibss"}, 310bcb5c89dSSowmini Varadhan 311bcb5c89dSSowmini Varadhan /* wl_wpa_ie_t has variable length */ 312bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SETOPTIE, sizeof (wl_wpa_ie_t), "set_ie"}, 313bcb5c89dSSowmini Varadhan 314bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DELKEY, sizeof (wl_del_key_t), "wpa_del_key"}, 315bcb5c89dSSowmini Varadhan 316bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY, sizeof (wl_key_t), "wl_key"}, 317bcb5c89dSSowmini Varadhan 318bcb5c89dSSowmini Varadhan { MAC_PROP_WL_MLME, sizeof (wl_mlme_t), "mlme"}, 319bcb5c89dSSowmini Varadhan 320da14cebeSEric Cheng { MAC_PROP_MAXBW, sizeof (mac_resource_props_t), "maxbw"}, 321da14cebeSEric Cheng 322da14cebeSEric Cheng { MAC_PROP_PRIO, sizeof (mac_resource_props_t), "priority"}, 323da14cebeSEric Cheng 324da14cebeSEric Cheng { MAC_PROP_BIND_CPU, sizeof (mac_resource_props_t), "cpus"}, 325da14cebeSEric Cheng 326e75f0919SSebastien Roy { MAC_PROP_TAGMODE, sizeof (link_tagmode_t), "tagmode"}, 327e75f0919SSebastien Roy 328bcb5c89dSSowmini Varadhan { MAC_PROP_PRIVATE, 0, "driver-private"} 329da14cebeSEric Cheng 330e7801d59Ssowmini }; 331e7801d59Ssowmini 332e7801d59Ssowmini static val_desc_t link_duplex_vals[] = { 333e7801d59Ssowmini { "half", LINK_DUPLEX_HALF }, 334e7801d59Ssowmini { "full", LINK_DUPLEX_HALF } 335e7801d59Ssowmini }; 336e7801d59Ssowmini static val_desc_t link_status_vals[] = { 337e7801d59Ssowmini { "up", LINK_STATE_UP }, 338e7801d59Ssowmini { "down", LINK_STATE_DOWN } 339e7801d59Ssowmini }; 340e7801d59Ssowmini static val_desc_t link_01_vals[] = { 341e7801d59Ssowmini { "1", 1 }, 342e7801d59Ssowmini { "0", 0 } 343e7801d59Ssowmini }; 344e7801d59Ssowmini static val_desc_t link_flow_vals[] = { 345e7801d59Ssowmini { "no", LINK_FLOWCTRL_NONE }, 346e7801d59Ssowmini { "tx", LINK_FLOWCTRL_TX }, 347e7801d59Ssowmini { "rx", LINK_FLOWCTRL_RX }, 348e7801d59Ssowmini { "bi", LINK_FLOWCTRL_BI } 349e7801d59Ssowmini }; 350da14cebeSEric Cheng static val_desc_t link_priority_vals[] = { 351da14cebeSEric Cheng { "low", MPL_LOW }, 352da14cebeSEric Cheng { "medium", MPL_MEDIUM }, 353da14cebeSEric Cheng { "high", MPL_HIGH } 354da14cebeSEric Cheng }; 355e7801d59Ssowmini 356e75f0919SSebastien Roy static val_desc_t link_tagmode_vals[] = { 357e75f0919SSebastien Roy { "normal", LINK_TAGMODE_NORMAL }, 358e75f0919SSebastien Roy { "vlanonly", LINK_TAGMODE_VLANONLY } 359e75f0919SSebastien Roy }; 360e75f0919SSebastien Roy 361d62bc4baSyz147064 static val_desc_t dladm_wlan_radio_vals[] = { 362d62bc4baSyz147064 { "on", DLADM_WLAN_RADIO_ON }, 363d62bc4baSyz147064 { "off", DLADM_WLAN_RADIO_OFF } 364d62bc4baSyz147064 }; 365d62bc4baSyz147064 366d62bc4baSyz147064 static val_desc_t dladm_wlan_powermode_vals[] = { 367d62bc4baSyz147064 { "off", DLADM_WLAN_PM_OFF }, 368d62bc4baSyz147064 { "fast", DLADM_WLAN_PM_FAST }, 369d62bc4baSyz147064 { "max", DLADM_WLAN_PM_MAX } 370d62bc4baSyz147064 }; 371d62bc4baSyz147064 372da14cebeSEric Cheng #define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) 373da14cebeSEric Cheng #define RESET_VAL ((uintptr_t)-1) 374d62bc4baSyz147064 375da14cebeSEric Cheng static prop_desc_t prop_table[] = { 376e7801d59Ssowmini { "channel", { NULL, 0 }, 377e7801d59Ssowmini NULL, 0, NULL, NULL, 378d62bc4baSyz147064 do_get_channel_prop, NULL, 0, 379d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 380d62bc4baSyz147064 381d62bc4baSyz147064 { "powermode", { "off", DLADM_WLAN_PM_OFF }, 382d62bc4baSyz147064 dladm_wlan_powermode_vals, VALCNT(dladm_wlan_powermode_vals), 383d62bc4baSyz147064 do_set_powermode_prop, NULL, 384d62bc4baSyz147064 do_get_powermode_prop, NULL, 0, 385d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 386d62bc4baSyz147064 387d62bc4baSyz147064 { "radio", { "on", DLADM_WLAN_RADIO_ON }, 388d62bc4baSyz147064 dladm_wlan_radio_vals, VALCNT(dladm_wlan_radio_vals), 389d62bc4baSyz147064 do_set_radio_prop, NULL, 390d62bc4baSyz147064 do_get_radio_prop, NULL, 0, 391d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 392d62bc4baSyz147064 393d62bc4baSyz147064 { "speed", { "", 0 }, NULL, 0, 394d62bc4baSyz147064 do_set_rate_prop, do_get_rate_mod, 395d62bc4baSyz147064 do_get_rate_prop, do_check_rate, 0, 3966b9e797cSsowmini DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE }, 397d62bc4baSyz147064 3984045d941Ssowmini { "autopush", { "", 0 }, NULL, 0, 3993bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, 4003bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_autopush, do_check_autopush, PD_CHECK_ALLOC, 401d62bc4baSyz147064 DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 402d62bc4baSyz147064 4034045d941Ssowmini { "zone", { "", 0 }, NULL, 0, 404f4b3ec61Sdh155122 do_set_zone, NULL, 4053bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_zone, do_check_zone, PD_TEMPONLY|PD_CHECK_ALLOC, 406e7801d59Ssowmini DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 407e7801d59Ssowmini 4084045d941Ssowmini { "duplex", { "", 0 }, 409e7801d59Ssowmini link_duplex_vals, VALCNT(link_duplex_vals), 4103bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_duplex_get, NULL, 411e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 412e7801d59Ssowmini 4136b9e797cSsowmini { "state", { "up", LINK_STATE_UP }, 414e7801d59Ssowmini link_status_vals, VALCNT(link_status_vals), 4153bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_status_get, NULL, 4164045d941Ssowmini 0, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 417e7801d59Ssowmini 418e7801d59Ssowmini { "adv_autoneg_cap", { "1", 1 }, 419e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4203bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 421e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 422e7801d59Ssowmini 4234045d941Ssowmini { "mtu", { "", 0 }, NULL, 0, 424f0f2c3a5SGirish Moodalbail i_dladm_set_public_prop, i_dladm_range_get, 425f0f2c3a5SGirish Moodalbail i_dladm_uint32_get, i_dladm_defmtu_check, 0, DATALINK_CLASS_ALL, 4263bc21d0aSAruna Ramakrishna - Sun Microsystems DATALINK_ANY_MEDIATYPE }, 427e7801d59Ssowmini 4284045d941Ssowmini { "flowctrl", { "", 0 }, 429e7801d59Ssowmini link_flow_vals, VALCNT(link_flow_vals), 4303bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_flowctl_get, NULL, 431e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 432e7801d59Ssowmini 433aca118b7Slucy wang - Sun Microsystems - Beijing China { "adv_10gfdx_cap", { "", 0 }, 434aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 435aca118b7Slucy wang - Sun Microsystems - Beijing China NULL, NULL, i_dladm_binary_get, NULL, 436aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 437aca118b7Slucy wang - Sun Microsystems - Beijing China 438aca118b7Slucy wang - Sun Microsystems - Beijing China { "en_10gfdx_cap", { "", 0 }, 439aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 440aca118b7Slucy wang - Sun Microsystems - Beijing China i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 441aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 442aca118b7Slucy wang - Sun Microsystems - Beijing China 4434045d941Ssowmini { "adv_1000fdx_cap", { "", 0 }, 4444045d941Ssowmini link_01_vals, VALCNT(link_01_vals), 4453bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 446e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 447e7801d59Ssowmini 4484045d941Ssowmini { "en_1000fdx_cap", { "", 0 }, 449e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4503bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 451e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 452e7801d59Ssowmini 4534045d941Ssowmini { "adv_1000hdx_cap", { "", 0 }, 454e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4553bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 456e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 457e7801d59Ssowmini 4584045d941Ssowmini { "en_1000hdx_cap", { "", 0 }, 459e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4603bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 461e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 462e7801d59Ssowmini 4634045d941Ssowmini { "adv_100fdx_cap", { "", 0 }, 464e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4653bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 466e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 467e7801d59Ssowmini 4684045d941Ssowmini { "en_100fdx_cap", { "", 0 }, 469e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4703bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 471e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 472e7801d59Ssowmini 4734045d941Ssowmini { "adv_100hdx_cap", { "", 0 }, 474e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4753bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 476e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 477e7801d59Ssowmini 4784045d941Ssowmini { "en_100hdx_cap", { "", 0 }, 479e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4803bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 481e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 482e7801d59Ssowmini 4834045d941Ssowmini { "adv_10fdx_cap", { "", 0 }, 484e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4853bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 486e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 487e7801d59Ssowmini 4884045d941Ssowmini { "en_10fdx_cap", { "", 0 }, 489e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4903bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 491e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 492e7801d59Ssowmini 4934045d941Ssowmini { "adv_10hdx_cap", { "", 0 }, 494e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4953bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 496e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 497e7801d59Ssowmini 4984045d941Ssowmini { "en_10hdx_cap", { "", 0 }, 499e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5003bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 501da14cebeSEric Cheng 0, DATALINK_CLASS_PHYS, DL_ETHER }, 502e7801d59Ssowmini 503da14cebeSEric Cheng { "maxbw", { "--", RESET_VAL }, NULL, 0, 504da14cebeSEric Cheng do_set_res, NULL, 50562ee1d25SArtem Kachitchkine i_dladm_maxbw_get, do_check_maxbw, PD_CHECK_ALLOC, 506da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 507da14cebeSEric Cheng 508da14cebeSEric Cheng { "cpus", { "--", RESET_VAL }, NULL, 0, 509da14cebeSEric Cheng do_set_cpus, NULL, 51062ee1d25SArtem Kachitchkine i_dladm_cpus_get, do_check_cpus, 0, 511da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 512da14cebeSEric Cheng 513da14cebeSEric Cheng { "priority", { "high", RESET_VAL }, 514da14cebeSEric Cheng link_priority_vals, VALCNT(link_priority_vals), do_set_res, NULL, 51562ee1d25SArtem Kachitchkine i_dladm_priority_get, do_check_priority, PD_CHECK_ALLOC, 516da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 517e75f0919SSebastien Roy 518e75f0919SSebastien Roy { "tagmode", { "vlanonly", LINK_TAGMODE_VLANONLY }, 519e75f0919SSebastien Roy link_tagmode_vals, VALCNT(link_tagmode_vals), 520e75f0919SSebastien Roy i_dladm_set_public_prop, NULL, i_dladm_tagmode_get, 521e75f0919SSebastien Roy NULL, 0, 522e75f0919SSebastien Roy DATALINK_CLASS_PHYS | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC, 523e75f0919SSebastien Roy DL_ETHER } 524f4b3ec61Sdh155122 }; 525f4b3ec61Sdh155122 526d62bc4baSyz147064 #define DLADM_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t)) 5270ba2cbe9Sxc151355 528da14cebeSEric Cheng static resource_prop_t rsrc_prop_table[] = { 529da14cebeSEric Cheng {"maxbw", do_extract_maxbw}, 530da14cebeSEric Cheng {"priority", do_extract_priority}, 531da14cebeSEric Cheng {"cpus", do_extract_cpus} 532da14cebeSEric Cheng }; 533da14cebeSEric Cheng #define DLADM_MAX_RSRC_PROP (sizeof (rsrc_prop_table) / \ 534da14cebeSEric Cheng sizeof (resource_prop_t)) 535da14cebeSEric Cheng 536bcb5c89dSSowmini Varadhan /* 537bcb5c89dSSowmini Varadhan * when retrieving private properties, we pass down a buffer with 538bcb5c89dSSowmini Varadhan * DLADM_PROP_BUF_CHUNK of space for the driver to return the property value. 539bcb5c89dSSowmini Varadhan */ 540bcb5c89dSSowmini Varadhan #define DLADM_PROP_BUF_CHUNK 1024 541bcb5c89dSSowmini Varadhan 5424ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t, 5434ac67f02SAnurag S. Maskey const char *, char **, uint_t); 5444ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t, 5454ac67f02SAnurag S. Maskey const char *, char **, uint_t *); 54662ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_walk_linkprop_priv_db(dladm_handle_t, 54762ee1d25SArtem Kachitchkine datalink_id_t, void *, int (*)(dladm_handle_t, 54862ee1d25SArtem Kachitchkine datalink_id_t, const char *, void *)); 5494ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t, 5504ac67f02SAnurag S. Maskey datalink_class_t, uint32_t, prop_desc_t *, char **, 5514ac67f02SAnurag S. Maskey uint_t, uint_t); 5524ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t, 5534ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 5544ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *, 5554ac67f02SAnurag S. Maskey datalink_id_t, datalink_media_t, uint_t); 556da14cebeSEric Cheng 557d62bc4baSyz147064 /* 558d62bc4baSyz147064 * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all 559d62bc4baSyz147064 * rates to be retrieved. However, we cannot increase it at this 560d62bc4baSyz147064 * time because it will break binary compatibility with unbundled 561d62bc4baSyz147064 * WiFi drivers and utilities. So for now we define an additional 562d62bc4baSyz147064 * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved. 563d62bc4baSyz147064 */ 564d62bc4baSyz147064 #define MAX_SUPPORT_RATES 64 565d62bc4baSyz147064 566d62bc4baSyz147064 #define AP_ANCHOR "[anchor]" 567d62bc4baSyz147064 #define AP_DELIMITER '.' 568d62bc4baSyz147064 569d62bc4baSyz147064 static dladm_status_t 570d62bc4baSyz147064 do_check_prop(prop_desc_t *pdp, char **prop_val, uint_t val_cnt, 571d62bc4baSyz147064 val_desc_t *vdp) 5720ba2cbe9Sxc151355 { 573d62bc4baSyz147064 int i, j; 5740ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 5750ba2cbe9Sxc151355 576d62bc4baSyz147064 for (j = 0; j < val_cnt; j++) { 577d62bc4baSyz147064 for (i = 0; i < pdp->pd_noptval; i++) { 578d62bc4baSyz147064 if (strcasecmp(*prop_val, 579d62bc4baSyz147064 pdp->pd_optval[i].vd_name) == 0) { 5800ba2cbe9Sxc151355 break; 5810ba2cbe9Sxc151355 } 5820ba2cbe9Sxc151355 } 583d62bc4baSyz147064 if (i == pdp->pd_noptval) { 584d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 585d62bc4baSyz147064 goto done; 586d62bc4baSyz147064 } 587d62bc4baSyz147064 (void) memcpy(vdp + j, &pdp->pd_optval[i], sizeof (val_desc_t)); 5880ba2cbe9Sxc151355 } 5890ba2cbe9Sxc151355 590d62bc4baSyz147064 done: 591d62bc4baSyz147064 return (status); 5920ba2cbe9Sxc151355 } 5930ba2cbe9Sxc151355 5940ba2cbe9Sxc151355 static dladm_status_t 5954ac67f02SAnurag S. Maskey i_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid, 5964ac67f02SAnurag S. Maskey datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val, 5974ac67f02SAnurag S. Maskey uint_t val_cnt, uint_t flags) 5980ba2cbe9Sxc151355 { 5990ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 600d62bc4baSyz147064 val_desc_t *vdp = NULL; 601d62bc4baSyz147064 boolean_t needfree = B_FALSE; 602d62bc4baSyz147064 uint_t cnt, i; 6030ba2cbe9Sxc151355 604d62bc4baSyz147064 if (!(pdp->pd_class & class)) 605d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 6060ba2cbe9Sxc151355 607d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 608d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 609d62bc4baSyz147064 610d62bc4baSyz147064 if ((flags & DLADM_OPT_PERSIST) && (pdp->pd_flags & PD_TEMPONLY)) 611d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 612d62bc4baSyz147064 613d62bc4baSyz147064 if (!(flags & DLADM_OPT_ACTIVE)) 614d62bc4baSyz147064 return (DLADM_STATUS_OK); 615d62bc4baSyz147064 616d62bc4baSyz147064 if (pdp->pd_set == NULL) 617d62bc4baSyz147064 return (DLADM_STATUS_PROPRDONLY); 618d62bc4baSyz147064 619d62bc4baSyz147064 if (prop_val != NULL) { 620d62bc4baSyz147064 vdp = malloc(sizeof (val_desc_t) * val_cnt); 621d62bc4baSyz147064 if (vdp == NULL) 622d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 623d62bc4baSyz147064 624d62bc4baSyz147064 if (pdp->pd_check != NULL) { 625da14cebeSEric Cheng needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0); 6264ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, prop_val, 6274ac67f02SAnurag S. Maskey val_cnt, vdp, media); 628d62bc4baSyz147064 } else if (pdp->pd_optval != NULL) { 629d62bc4baSyz147064 status = do_check_prop(pdp, prop_val, val_cnt, vdp); 630d62bc4baSyz147064 } else { 631d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 6320ba2cbe9Sxc151355 } 6330ba2cbe9Sxc151355 634d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 635d62bc4baSyz147064 goto done; 636d62bc4baSyz147064 637d62bc4baSyz147064 cnt = val_cnt; 638d62bc4baSyz147064 } else { 639da14cebeSEric Cheng boolean_t defval = B_FALSE; 640da14cebeSEric Cheng 641d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) 642d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 643d62bc4baSyz147064 6443bc21d0aSAruna Ramakrishna - Sun Microsystems cnt = 1; 645da14cebeSEric Cheng defval = (strlen(pdp->pd_defval.vd_name) > 0); 646da14cebeSEric Cheng if ((pdp->pd_flags & PD_CHECK_ALLOC) != 0 || defval) { 647d62bc4baSyz147064 if ((vdp = malloc(sizeof (val_desc_t))) == NULL) 648d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 6493bc21d0aSAruna Ramakrishna - Sun Microsystems 650da14cebeSEric Cheng if (defval) { 651da14cebeSEric Cheng (void) memcpy(vdp, &pdp->pd_defval, 652da14cebeSEric Cheng sizeof (val_desc_t)); 653da14cebeSEric Cheng } else if (pdp->pd_check != NULL) { 6544ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, 6554ac67f02SAnurag S. Maskey prop_val, cnt, vdp, media); 6563bc21d0aSAruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK) 6573bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 6583bc21d0aSAruna Ramakrishna - Sun Microsystems } 6594045d941Ssowmini } else { 6604ac67f02SAnurag S. Maskey status = i_dladm_getset_defval(handle, pdp, linkid, 6614045d941Ssowmini media, flags); 6624045d941Ssowmini return (status); 6634045d941Ssowmini } 664d62bc4baSyz147064 } 6654ac67f02SAnurag S. Maskey status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags, media); 666d62bc4baSyz147064 if (needfree) { 667d62bc4baSyz147064 for (i = 0; i < cnt; i++) 668e7801d59Ssowmini free((void *)((val_desc_t *)vdp + i)->vd_val); 669d62bc4baSyz147064 } 670d62bc4baSyz147064 done: 671d62bc4baSyz147064 free(vdp); 672d62bc4baSyz147064 return (status); 673d62bc4baSyz147064 } 674d62bc4baSyz147064 675d62bc4baSyz147064 static dladm_status_t 6764ac67f02SAnurag S. Maskey i_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 6774ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 678d62bc4baSyz147064 { 679d62bc4baSyz147064 int i; 680d62bc4baSyz147064 boolean_t found = B_FALSE; 681d62bc4baSyz147064 datalink_class_t class; 682d62bc4baSyz147064 uint32_t media; 683d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 684d62bc4baSyz147064 6854ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 6864ac67f02SAnurag S. Maskey NULL, 0); 687d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 6880ba2cbe9Sxc151355 return (status); 6890ba2cbe9Sxc151355 690d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 691d62bc4baSyz147064 prop_desc_t *pdp = &prop_table[i]; 692d62bc4baSyz147064 dladm_status_t s; 6930ba2cbe9Sxc151355 694d62bc4baSyz147064 if (prop_name != NULL && 695d62bc4baSyz147064 (strcasecmp(prop_name, pdp->pd_name) != 0)) 696d62bc4baSyz147064 continue; 697d62bc4baSyz147064 found = B_TRUE; 6984ac67f02SAnurag S. Maskey s = i_dladm_set_single_prop(handle, linkid, class, media, pdp, 6994ac67f02SAnurag S. Maskey prop_val, val_cnt, flags); 700d62bc4baSyz147064 701d62bc4baSyz147064 if (prop_name != NULL) { 702d62bc4baSyz147064 status = s; 703d62bc4baSyz147064 break; 704d62bc4baSyz147064 } else { 705d62bc4baSyz147064 if (s != DLADM_STATUS_OK && 706d62bc4baSyz147064 s != DLADM_STATUS_NOTSUP) 707d62bc4baSyz147064 status = s; 708d62bc4baSyz147064 } 709d62bc4baSyz147064 } 710e7801d59Ssowmini if (!found) { 711e7801d59Ssowmini if (prop_name[0] == '_') { 712e7801d59Ssowmini /* other private properties */ 713*3361618bSRishi Srivatsavai status = i_dladm_set_private_prop(handle, linkid, 714*3361618bSRishi Srivatsavai prop_name, prop_val, val_cnt, flags); 715e7801d59Ssowmini } else { 7160ba2cbe9Sxc151355 status = DLADM_STATUS_NOTFOUND; 717e7801d59Ssowmini } 718e7801d59Ssowmini } 7190ba2cbe9Sxc151355 7200ba2cbe9Sxc151355 return (status); 7210ba2cbe9Sxc151355 } 7220ba2cbe9Sxc151355 723d62bc4baSyz147064 /* 724d62bc4baSyz147064 * Set/reset link property for specific link 725d62bc4baSyz147064 */ 726d62bc4baSyz147064 dladm_status_t 7274ac67f02SAnurag S. Maskey dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 7284ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 7290ba2cbe9Sxc151355 { 730d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 7310ba2cbe9Sxc151355 732d62bc4baSyz147064 if ((linkid == DATALINK_INVALID_LINKID) || (flags == 0) || 733d62bc4baSyz147064 (prop_val == NULL && val_cnt > 0) || 734d62bc4baSyz147064 (prop_val != NULL && val_cnt == 0) || 735d62bc4baSyz147064 (prop_name == NULL && prop_val != NULL)) { 736d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 7370ba2cbe9Sxc151355 } 7380ba2cbe9Sxc151355 739*3361618bSRishi Srivatsavai /* 740*3361618bSRishi Srivatsavai * Check for valid link property against the flags passed 741*3361618bSRishi Srivatsavai * and set the link property when active flag is passed. 742*3361618bSRishi Srivatsavai */ 7434ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val, 744d62bc4baSyz147064 val_cnt, flags); 745d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 746d62bc4baSyz147064 return (status); 747d62bc4baSyz147064 748d62bc4baSyz147064 if (flags & DLADM_OPT_PERSIST) { 7494ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop_db(handle, linkid, prop_name, 750d62bc4baSyz147064 prop_val, val_cnt); 751d62bc4baSyz147064 } 752d62bc4baSyz147064 return (status); 753d62bc4baSyz147064 } 754d62bc4baSyz147064 755d62bc4baSyz147064 /* 75662ee1d25SArtem Kachitchkine * Walk all link properties of the given specific link. 75762ee1d25SArtem Kachitchkine * 75862ee1d25SArtem Kachitchkine * Note: this function currently lacks the ability to walk _all_ private 75962ee1d25SArtem Kachitchkine * properties if the link, because there is no kernel interface to 76062ee1d25SArtem Kachitchkine * retrieve all known private property names. Once such an interface 76162ee1d25SArtem Kachitchkine * is added, this function should be fixed accordingly. 762d62bc4baSyz147064 */ 763d62bc4baSyz147064 dladm_status_t 7644ac67f02SAnurag S. Maskey dladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg, 7654ac67f02SAnurag S. Maskey int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 7660ba2cbe9Sxc151355 { 767d62bc4baSyz147064 dladm_status_t status; 768d62bc4baSyz147064 datalink_class_t class; 769d62bc4baSyz147064 uint_t media; 770d62bc4baSyz147064 int i; 7710ba2cbe9Sxc151355 772d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || func == NULL) 773d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 7740ba2cbe9Sxc151355 7754ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 7764ac67f02SAnurag S. Maskey NULL, 0); 777d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 778d62bc4baSyz147064 return (status); 779d62bc4baSyz147064 78062ee1d25SArtem Kachitchkine /* public */ 781d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 782d62bc4baSyz147064 if (!(prop_table[i].pd_class & class)) 783d62bc4baSyz147064 continue; 784d62bc4baSyz147064 785d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media)) 786d62bc4baSyz147064 continue; 787d62bc4baSyz147064 7884ac67f02SAnurag S. Maskey if (func(handle, linkid, prop_table[i].pd_name, arg) == 789d62bc4baSyz147064 DLADM_WALK_TERMINATE) { 790d62bc4baSyz147064 break; 791d62bc4baSyz147064 } 792d62bc4baSyz147064 } 793d62bc4baSyz147064 79462ee1d25SArtem Kachitchkine /* private */ 79562ee1d25SArtem Kachitchkine status = i_dladm_walk_linkprop_priv_db(handle, linkid, arg, func); 79662ee1d25SArtem Kachitchkine 79762ee1d25SArtem Kachitchkine return (status); 798d62bc4baSyz147064 } 799d62bc4baSyz147064 800d62bc4baSyz147064 /* 801d62bc4baSyz147064 * Get linkprop of the given specific link. 802d62bc4baSyz147064 */ 803d62bc4baSyz147064 dladm_status_t 8044ac67f02SAnurag S. Maskey dladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid, 8054ac67f02SAnurag S. Maskey dladm_prop_type_t type, const char *prop_name, char **prop_val, 8064ac67f02SAnurag S. Maskey uint_t *val_cntp) 807d62bc4baSyz147064 { 808d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 809d62bc4baSyz147064 datalink_class_t class; 810d62bc4baSyz147064 uint_t media; 811d62bc4baSyz147064 prop_desc_t *pdp; 8124045d941Ssowmini uint_t cnt, dld_flags = 0; 813d62bc4baSyz147064 int i; 814afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 815d62bc4baSyz147064 8164045d941Ssowmini if (type == DLADM_PROP_VAL_DEFAULT) 817f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_DEFAULT; 818f0f2c3a5SGirish Moodalbail else if (type == DLADM_PROP_VAL_MODIFIABLE) 819f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_POSSIBLE; 8204045d941Ssowmini 821d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 822d62bc4baSyz147064 prop_val == NULL || val_cntp == NULL || *val_cntp == 0) 823d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 824d62bc4baSyz147064 825d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) 826d62bc4baSyz147064 if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) 827d62bc4baSyz147064 break; 828d62bc4baSyz147064 829e7801d59Ssowmini if (i == DLADM_MAX_PROPS) { 830e7801d59Ssowmini if (prop_name[0] == '_') { 831e7801d59Ssowmini /* 832e7801d59Ssowmini * private property. 833e7801d59Ssowmini */ 83462ee1d25SArtem Kachitchkine if (type == DLADM_PROP_VAL_PERSISTENT) 83562ee1d25SArtem Kachitchkine return (i_dladm_get_linkprop_db(handle, linkid, 83662ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp)); 83762ee1d25SArtem Kachitchkine else 83862ee1d25SArtem Kachitchkine return (i_dladm_get_priv_prop(handle, linkid, 83962ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp, type, 84062ee1d25SArtem Kachitchkine dld_flags)); 841e7801d59Ssowmini } else { 842d62bc4baSyz147064 return (DLADM_STATUS_NOTFOUND); 843e7801d59Ssowmini } 844e7801d59Ssowmini } 845d62bc4baSyz147064 846d62bc4baSyz147064 pdp = &prop_table[i]; 847d62bc4baSyz147064 8484ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 8494ac67f02SAnurag S. Maskey NULL, 0); 850d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 851d62bc4baSyz147064 return (status); 852d62bc4baSyz147064 853d62bc4baSyz147064 if (!(pdp->pd_class & class)) 854d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 855d62bc4baSyz147064 856d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 857d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 858d62bc4baSyz147064 859d62bc4baSyz147064 switch (type) { 860d62bc4baSyz147064 case DLADM_PROP_VAL_CURRENT: 8614ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 8624ac67f02SAnurag S. Maskey media, dld_flags, &perm_flags); 863afdda45fSVasumathi Sundaram - Sun Microsystems break; 864afdda45fSVasumathi Sundaram - Sun Microsystems 865afdda45fSVasumathi Sundaram - Sun Microsystems case DLADM_PROP_VAL_PERM: 866afdda45fSVasumathi Sundaram - Sun Microsystems if (pdp->pd_set == NULL) { 867afdda45fSVasumathi Sundaram - Sun Microsystems perm_flags = MAC_PROP_PERM_READ; 868afdda45fSVasumathi Sundaram - Sun Microsystems } else { 8694ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 8704ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 871afdda45fSVasumathi Sundaram - Sun Microsystems } 872afdda45fSVasumathi Sundaram - Sun Microsystems 873afdda45fSVasumathi Sundaram - Sun Microsystems *prop_val[0] = '\0'; 87463a6526dSMichael Lim *val_cntp = 1; 875da14cebeSEric Cheng if (status == DLADM_STATUS_OK) 876da14cebeSEric Cheng (void) dladm_perm2str(perm_flags, *prop_val); 877d62bc4baSyz147064 break; 878d62bc4baSyz147064 879d62bc4baSyz147064 case DLADM_PROP_VAL_DEFAULT: 88013a55820Sar224390 /* 88113a55820Sar224390 * If defaults are not defined for the property, 88213a55820Sar224390 * pd_defval.vd_name should be null. If the driver 88313a55820Sar224390 * has to be contacted for the value, vd_name should 88413a55820Sar224390 * be the empty string (""). Otherwise, dladm will 88513a55820Sar224390 * just print whatever is in the table. 88613a55820Sar224390 */ 887d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) { 888d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 889d62bc4baSyz147064 break; 890d62bc4baSyz147064 } 8914045d941Ssowmini 8924045d941Ssowmini if (strlen(pdp->pd_defval.vd_name) == 0) { 8934ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 8944ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 8954045d941Ssowmini } else { 896d62bc4baSyz147064 (void) strcpy(*prop_val, pdp->pd_defval.vd_name); 8974045d941Ssowmini } 898d62bc4baSyz147064 *val_cntp = 1; 899d62bc4baSyz147064 break; 900d62bc4baSyz147064 901d62bc4baSyz147064 case DLADM_PROP_VAL_MODIFIABLE: 902d62bc4baSyz147064 if (pdp->pd_getmod != NULL) { 9034ac67f02SAnurag S. Maskey status = pdp->pd_getmod(handle, pdp, linkid, prop_val, 904afdda45fSVasumathi Sundaram - Sun Microsystems val_cntp, media, dld_flags, &perm_flags); 905d62bc4baSyz147064 break; 906d62bc4baSyz147064 } 907d62bc4baSyz147064 cnt = pdp->pd_noptval; 908d62bc4baSyz147064 if (cnt == 0) { 909d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 910d62bc4baSyz147064 } else if (cnt > *val_cntp) { 911d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 912d62bc4baSyz147064 } else { 913d62bc4baSyz147064 for (i = 0; i < cnt; i++) { 914d62bc4baSyz147064 (void) strcpy(prop_val[i], 915d62bc4baSyz147064 pdp->pd_optval[i].vd_name); 916d62bc4baSyz147064 } 917d62bc4baSyz147064 *val_cntp = cnt; 918d62bc4baSyz147064 } 919d62bc4baSyz147064 break; 920d62bc4baSyz147064 case DLADM_PROP_VAL_PERSISTENT: 921d62bc4baSyz147064 if (pdp->pd_flags & PD_TEMPONLY) 922d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 9234ac67f02SAnurag S. Maskey status = i_dladm_get_linkprop_db(handle, linkid, prop_name, 924d62bc4baSyz147064 prop_val, val_cntp); 925d62bc4baSyz147064 break; 926d62bc4baSyz147064 default: 927d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 928d62bc4baSyz147064 break; 929d62bc4baSyz147064 } 930d62bc4baSyz147064 931d62bc4baSyz147064 return (status); 932d62bc4baSyz147064 } 933d62bc4baSyz147064 934d62bc4baSyz147064 /*ARGSUSED*/ 935d62bc4baSyz147064 static int 9364ac67f02SAnurag S. Maskey i_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid, 9374ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 938d62bc4baSyz147064 { 939d62bc4baSyz147064 char *buf, **propvals; 940d62bc4baSyz147064 uint_t i, valcnt = DLADM_MAX_PROP_VALCNT; 941d62bc4baSyz147064 942d62bc4baSyz147064 if ((buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * 943d62bc4baSyz147064 DLADM_MAX_PROP_VALCNT)) == NULL) { 944d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 945d62bc4baSyz147064 } 946d62bc4baSyz147064 947d62bc4baSyz147064 propvals = (char **)(void *)buf; 948d62bc4baSyz147064 for (i = 0; i < valcnt; i++) { 949d62bc4baSyz147064 propvals[i] = buf + 950d62bc4baSyz147064 sizeof (char *) * DLADM_MAX_PROP_VALCNT + 951d62bc4baSyz147064 i * DLADM_PROP_VAL_MAX; 952d62bc4baSyz147064 } 953d62bc4baSyz147064 9544ac67f02SAnurag S. Maskey if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 9554ac67f02SAnurag S. Maskey prop_name, propvals, &valcnt) != DLADM_STATUS_OK) { 956d62bc4baSyz147064 goto done; 957d62bc4baSyz147064 } 958d62bc4baSyz147064 9594ac67f02SAnurag S. Maskey (void) dladm_set_linkprop(handle, linkid, prop_name, propvals, valcnt, 960d62bc4baSyz147064 DLADM_OPT_ACTIVE); 961d62bc4baSyz147064 962d62bc4baSyz147064 done: 963d62bc4baSyz147064 if (buf != NULL) 964d62bc4baSyz147064 free(buf); 965d62bc4baSyz147064 966d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 967d62bc4baSyz147064 } 968d62bc4baSyz147064 969d62bc4baSyz147064 /*ARGSUSED*/ 970d62bc4baSyz147064 static int 9714ac67f02SAnurag S. Maskey i_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg) 972d62bc4baSyz147064 { 973da14cebeSEric Cheng datalink_class_t class; 974da14cebeSEric Cheng dladm_status_t status; 975da14cebeSEric Cheng 9764ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, 9774ac67f02SAnurag S. Maskey NULL, 0); 978da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 979da14cebeSEric Cheng return (DLADM_WALK_TERMINATE); 980da14cebeSEric Cheng 981da14cebeSEric Cheng if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0) 9824ac67f02SAnurag S. Maskey (void) dladm_init_linkprop(handle, linkid, B_TRUE); 983da14cebeSEric Cheng 984d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 9850ba2cbe9Sxc151355 } 9860ba2cbe9Sxc151355 9870ba2cbe9Sxc151355 dladm_status_t 9884ac67f02SAnurag S. Maskey dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, 9894ac67f02SAnurag S. Maskey boolean_t any_media) 9900ba2cbe9Sxc151355 { 99130890389Sartem datalink_media_t dmedia; 99230890389Sartem uint32_t media; 99330890389Sartem 99430890389Sartem dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI; 99530890389Sartem 996d62bc4baSyz147064 if (linkid == DATALINK_ALL_LINKID) { 9974ac67f02SAnurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, 9984ac67f02SAnurag S. Maskey NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); 9994ac67f02SAnurag S. Maskey } else if (any_media || 10004ac67f02SAnurag S. Maskey ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL, 10014ac67f02SAnurag S. Maskey 0) == DLADM_STATUS_OK) && 100230890389Sartem DATALINK_MEDIA_ACCEPTED(dmedia, media))) { 10034ac67f02SAnurag S. Maskey (void) dladm_walk_linkprop(handle, linkid, NULL, 10044ac67f02SAnurag S. Maskey i_dladm_init_one_prop); 1005d62bc4baSyz147064 } 1006d62bc4baSyz147064 return (DLADM_STATUS_OK); 10070ba2cbe9Sxc151355 } 1008f4b3ec61Sdh155122 1009e7801d59Ssowmini /* ARGSUSED */ 1010f4b3ec61Sdh155122 static dladm_status_t 10114ac67f02SAnurag S. Maskey do_get_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1012da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1013da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1014f4b3ec61Sdh155122 { 1015d62bc4baSyz147064 char zone_name[ZONENAME_MAX]; 1016d62bc4baSyz147064 zoneid_t zid; 1017d62bc4baSyz147064 dladm_status_t status; 10183bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 10193bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1020f4b3ec61Sdh155122 10214045d941Ssowmini if (flags != 0) 10224045d941Ssowmini return (DLADM_STATUS_NOTSUP); 10234045d941Ssowmini 10244ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1025da14cebeSEric Cheng &status, perm_flags); 1026d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1027d62bc4baSyz147064 return (status); 1028d62bc4baSyz147064 10293bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 10303bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid, cp, sizeof (zid)); 10313bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 10323bc21d0aSAruna Ramakrishna - Sun Microsystems 1033d62bc4baSyz147064 *val_cnt = 1; 1034d62bc4baSyz147064 if (zid != GLOBAL_ZONEID) { 1035afdda45fSVasumathi Sundaram - Sun Microsystems if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) { 1036f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1037afdda45fSVasumathi Sundaram - Sun Microsystems } 1038f4b3ec61Sdh155122 1039d62bc4baSyz147064 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX); 104047a01978Sbw } else { 1041d62bc4baSyz147064 *prop_val[0] = '\0'; 104247a01978Sbw } 1043f4b3ec61Sdh155122 1044f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1045f4b3ec61Sdh155122 } 1046f4b3ec61Sdh155122 1047f4b3ec61Sdh155122 typedef int (*zone_get_devroot_t)(char *, char *, size_t); 1048f4b3ec61Sdh155122 1049f4b3ec61Sdh155122 static int 1050f4b3ec61Sdh155122 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen) 1051f4b3ec61Sdh155122 { 1052f4b3ec61Sdh155122 char root[MAXPATHLEN]; 1053f4b3ec61Sdh155122 zone_get_devroot_t real_zone_get_devroot; 1054f4b3ec61Sdh155122 void *dlhandle; 1055f4b3ec61Sdh155122 void *sym; 1056f4b3ec61Sdh155122 int ret; 1057f4b3ec61Sdh155122 1058f4b3ec61Sdh155122 if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL) 1059f4b3ec61Sdh155122 return (-1); 1060f4b3ec61Sdh155122 1061f4b3ec61Sdh155122 if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) { 1062f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1063f4b3ec61Sdh155122 return (-1); 1064f4b3ec61Sdh155122 } 1065f4b3ec61Sdh155122 1066f4b3ec61Sdh155122 real_zone_get_devroot = (zone_get_devroot_t)sym; 1067f4b3ec61Sdh155122 1068f4b3ec61Sdh155122 if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0) 1069f4b3ec61Sdh155122 (void) snprintf(dev, devlen, "%s%s", root, "/dev"); 1070f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1071f4b3ec61Sdh155122 return (ret); 1072f4b3ec61Sdh155122 } 1073f4b3ec61Sdh155122 1074f4b3ec61Sdh155122 static dladm_status_t 10754ac67f02SAnurag S. Maskey i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid, 10764ac67f02SAnurag S. Maskey datalink_id_t linkid, boolean_t add) 1077f4b3ec61Sdh155122 { 1078f4b3ec61Sdh155122 char path[MAXPATHLEN]; 1079d62bc4baSyz147064 char name[MAXLINKNAMELEN]; 1080f4b3ec61Sdh155122 di_prof_t prof = NULL; 1081f4b3ec61Sdh155122 char zone_name[ZONENAME_MAX]; 1082f4b3ec61Sdh155122 dladm_status_t status; 1083d62bc4baSyz147064 int ret; 1084f4b3ec61Sdh155122 1085f4b3ec61Sdh155122 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) 1086f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1087f4b3ec61Sdh155122 if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0) 1088f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1089f4b3ec61Sdh155122 if (di_prof_init(path, &prof) != 0) 1090f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1091f4b3ec61Sdh155122 10924ac67f02SAnurag S. Maskey status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN); 1093f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1094d62bc4baSyz147064 goto cleanup; 1095f4b3ec61Sdh155122 1096d62bc4baSyz147064 if (add) 1097d62bc4baSyz147064 ret = di_prof_add_dev(prof, name); 1098d62bc4baSyz147064 else 1099d62bc4baSyz147064 ret = di_prof_add_exclude(prof, name); 1100f4b3ec61Sdh155122 1101d62bc4baSyz147064 if (ret != 0) { 1102d62bc4baSyz147064 status = dladm_errno2status(errno); 1103d62bc4baSyz147064 goto cleanup; 1104f4b3ec61Sdh155122 } 1105f4b3ec61Sdh155122 1106d62bc4baSyz147064 if (di_prof_commit(prof) != 0) 1107d62bc4baSyz147064 status = dladm_errno2status(errno); 1108d62bc4baSyz147064 cleanup: 1109d62bc4baSyz147064 if (prof) 1110d62bc4baSyz147064 di_prof_fini(prof); 1111d62bc4baSyz147064 1112d62bc4baSyz147064 return (status); 1113f4b3ec61Sdh155122 } 1114f4b3ec61Sdh155122 1115e7801d59Ssowmini /* ARGSUSED */ 1116f4b3ec61Sdh155122 static dladm_status_t 11174ac67f02SAnurag S. Maskey do_set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 11184ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1119f4b3ec61Sdh155122 { 11203bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 1121f4b3ec61Sdh155122 zoneid_t zid_old, zid_new; 1122d62bc4baSyz147064 char link[MAXLINKNAMELEN]; 11233bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 11243bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 11253bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1126f4b3ec61Sdh155122 1127f4b3ec61Sdh155122 if (val_cnt != 1) 1128f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1129f4b3ec61Sdh155122 11303bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = (dld_ioc_zid_t *)vdp->vd_val; 11313bc21d0aSAruna Ramakrishna - Sun Microsystems 11324ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1133da14cebeSEric Cheng &status, NULL); 1134f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1135f4b3ec61Sdh155122 return (status); 1136f4b3ec61Sdh155122 11373bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 11383bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid_old, cp, sizeof (zid_old)); 11393bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1140f4b3ec61Sdh155122 11413bc21d0aSAruna Ramakrishna - Sun Microsystems zid_new = dzp->diz_zid; 11423bc21d0aSAruna Ramakrishna - Sun Microsystems (void) strlcpy(link, dzp->diz_link, MAXLINKNAMELEN); 11433bc21d0aSAruna Ramakrishna - Sun Microsystems 11443bc21d0aSAruna Ramakrishna - Sun Microsystems /* Do nothing if setting to current value */ 11453bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new == zid_old) 11463bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 11473bc21d0aSAruna Ramakrishna - Sun Microsystems 1148d62bc4baSyz147064 if (zid_new != GLOBAL_ZONEID) { 1149d62bc4baSyz147064 /* 1150d62bc4baSyz147064 * If the new zoneid is the global zone, we could destroy 1151d62bc4baSyz147064 * the link (in the case of an implicitly-created VLAN) as a 11523bc21d0aSAruna Ramakrishna - Sun Microsystems * result of setting the zoneid. In that case, we defer the 11533bc21d0aSAruna Ramakrishna - Sun Microsystems * operation to the end of this function to avoid recreating 11543bc21d0aSAruna Ramakrishna - Sun Microsystems * the VLAN and getting a different linkid during the rollback 11553bc21d0aSAruna Ramakrishna - Sun Microsystems * if other operation fails. 1156d62bc4baSyz147064 * 11573bc21d0aSAruna Ramakrishna - Sun Microsystems * Otherwise, this operation will hold a reference to the 1158d62bc4baSyz147064 * link and prevent a link renaming, so we need to do it 1159d62bc4baSyz147064 * before other operations. 1160d62bc4baSyz147064 */ 11614ac67f02SAnurag S. Maskey status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, 11624ac67f02SAnurag S. Maskey val_cnt, flags, media); 1163d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1164d62bc4baSyz147064 return (status); 1165d62bc4baSyz147064 } 1166d62bc4baSyz147064 1167d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) { 1168d62bc4baSyz147064 if (zone_remove_datalink(zid_old, link) != 0 && 1169f4b3ec61Sdh155122 errno != ENXIO) { 1170f4b3ec61Sdh155122 status = dladm_errno2status(errno); 1171f4b3ec61Sdh155122 goto rollback1; 1172f4b3ec61Sdh155122 } 1173f4b3ec61Sdh155122 1174d62bc4baSyz147064 /* 1175d62bc4baSyz147064 * It is okay to fail to update the /dev entry (some 1176d62bc4baSyz147064 * vanity-named links do not have a /dev entry). 1177d62bc4baSyz147064 */ 11784ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, 11794ac67f02SAnurag S. Maskey B_FALSE); 1180d62bc4baSyz147064 } 1181d62bc4baSyz147064 1182d62bc4baSyz147064 if (zid_new != GLOBAL_ZONEID) { 1183d62bc4baSyz147064 if (zone_add_datalink(zid_new, link) != 0) { 1184d62bc4baSyz147064 status = dladm_errno2status(errno); 1185d62bc4baSyz147064 goto rollback2; 1186d62bc4baSyz147064 } 1187d62bc4baSyz147064 11884ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE); 1189d62bc4baSyz147064 } else { 11904ac67f02SAnurag S. Maskey status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, 11914ac67f02SAnurag S. Maskey val_cnt, flags, media); 1192f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1193f4b3ec61Sdh155122 goto rollback2; 1194f4b3ec61Sdh155122 } 1195f4b3ec61Sdh155122 1196f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1197f4b3ec61Sdh155122 1198f4b3ec61Sdh155122 rollback2: 1199f4b3ec61Sdh155122 if (zid_old != GLOBAL_ZONEID) 12004ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, B_TRUE); 1201d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) 1202d62bc4baSyz147064 (void) zone_add_datalink(zid_old, link); 1203f4b3ec61Sdh155122 rollback1: 12043bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new != GLOBAL_ZONEID) { 12053bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zid_old; 12064ac67f02SAnurag S. Maskey (void) i_dladm_set_public_prop(handle, pdp, linkid, vdp, 12074ac67f02SAnurag S. Maskey val_cnt, flags, media); 12083bc21d0aSAruna Ramakrishna - Sun Microsystems } 12093bc21d0aSAruna Ramakrishna - Sun Microsystems 1210f4b3ec61Sdh155122 return (status); 1211f4b3ec61Sdh155122 } 1212f4b3ec61Sdh155122 1213f4b3ec61Sdh155122 /* ARGSUSED */ 1214f4b3ec61Sdh155122 static dladm_status_t 12154ac67f02SAnurag S. Maskey do_check_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 12164ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1217f4b3ec61Sdh155122 { 12183bc21d0aSAruna Ramakrishna - Sun Microsystems char *zone_name; 12193bc21d0aSAruna Ramakrishna - Sun Microsystems char linkname[MAXLINKNAMELEN]; 12203bc21d0aSAruna Ramakrishna - Sun Microsystems zoneid_t zoneid; 12213bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 12223bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1223f4b3ec61Sdh155122 1224f4b3ec61Sdh155122 if (val_cnt != 1) 1225f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1226f4b3ec61Sdh155122 12273bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = malloc(sizeof (dld_ioc_zid_t)); 12283bc21d0aSAruna Ramakrishna - Sun Microsystems if (dzp == NULL) 12293bc21d0aSAruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM); 1230f4b3ec61Sdh155122 12314ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, 12323bc21d0aSAruna Ramakrishna - Sun Microsystems linkname, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { 12333bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 12343bc21d0aSAruna Ramakrishna - Sun Microsystems } 12353bc21d0aSAruna Ramakrishna - Sun Microsystems 1236da14cebeSEric Cheng zone_name = (prop_val != NULL) ? *prop_val : GLOBAL_ZONENAME; 12373bc21d0aSAruna Ramakrishna - Sun Microsystems if (strlen(linkname) > MAXLINKNAMELEN) { 12383bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 12393bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 12403bc21d0aSAruna Ramakrishna - Sun Microsystems } 12413bc21d0aSAruna Ramakrishna - Sun Microsystems 12423bc21d0aSAruna Ramakrishna - Sun Microsystems if ((zoneid = getzoneidbyname(zone_name)) == -1) { 12433bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 12443bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 12453bc21d0aSAruna Ramakrishna - Sun Microsystems } 12463bc21d0aSAruna Ramakrishna - Sun Microsystems 12473bc21d0aSAruna Ramakrishna - Sun Microsystems if (zoneid != GLOBAL_ZONEID) { 1248f4b3ec61Sdh155122 ushort_t flags; 1249f4b3ec61Sdh155122 12503bc21d0aSAruna Ramakrishna - Sun Microsystems if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &flags, 1251f4b3ec61Sdh155122 sizeof (flags)) < 0) { 12523bc21d0aSAruna Ramakrishna - Sun Microsystems status = dladm_errno2status(errno); 12533bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1254f4b3ec61Sdh155122 } 1255f4b3ec61Sdh155122 1256f4b3ec61Sdh155122 if (!(flags & ZF_NET_EXCL)) { 12573bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 12583bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1259f4b3ec61Sdh155122 } 1260f4b3ec61Sdh155122 } 1261f4b3ec61Sdh155122 12623bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memset(dzp, 0, sizeof (dld_ioc_zid_t)); 12633bc21d0aSAruna Ramakrishna - Sun Microsystems 12643bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zoneid; 12653bc21d0aSAruna Ramakrishna - Sun Microsystems (void) strlcpy(dzp->diz_link, linkname, MAXLINKNAMELEN); 12663bc21d0aSAruna Ramakrishna - Sun Microsystems 12673bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dzp; 1268f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 12693bc21d0aSAruna Ramakrishna - Sun Microsystems done: 12703bc21d0aSAruna Ramakrishna - Sun Microsystems free(dzp); 12713bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 1272f4b3ec61Sdh155122 } 1273f4b3ec61Sdh155122 1274e7801d59Ssowmini /* ARGSUSED */ 1275f4b3ec61Sdh155122 static dladm_status_t 127662ee1d25SArtem Kachitchkine i_dladm_maxbw_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1277da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1278da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1279da14cebeSEric Cheng { 1280da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1281da14cebeSEric Cheng mac_resource_props_t mrp; 1282da14cebeSEric Cheng dladm_status_t status; 1283da14cebeSEric Cheng 12844ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1285da14cebeSEric Cheng &status, perm_flags); 1286da14cebeSEric Cheng if (dip == NULL) 1287da14cebeSEric Cheng return (status); 1288da14cebeSEric Cheng 1289da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1290da14cebeSEric Cheng free(dip); 1291da14cebeSEric Cheng 1292da14cebeSEric Cheng if ((mrp.mrp_mask & MRP_MAXBW) == 0) { 1293da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1294da14cebeSEric Cheng } else { 1295da14cebeSEric Cheng (void) dladm_bw2str(mrp.mrp_maxbw, prop_val[0]); 1296da14cebeSEric Cheng } 1297da14cebeSEric Cheng *val_cnt = 1; 1298da14cebeSEric Cheng return (DLADM_STATUS_OK); 1299da14cebeSEric Cheng } 1300da14cebeSEric Cheng 1301da14cebeSEric Cheng /* ARGSUSED */ 1302da14cebeSEric Cheng static dladm_status_t 13034ac67f02SAnurag S. Maskey do_check_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 13044ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1305da14cebeSEric Cheng { 1306da14cebeSEric Cheng uint64_t *maxbw; 1307da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1308da14cebeSEric Cheng 1309da14cebeSEric Cheng if (val_cnt != 1) 1310da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1311da14cebeSEric Cheng 1312da14cebeSEric Cheng maxbw = malloc(sizeof (uint64_t)); 1313da14cebeSEric Cheng if (maxbw == NULL) 1314da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1315da14cebeSEric Cheng 1316da14cebeSEric Cheng status = dladm_str2bw(*prop_val, maxbw); 1317da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1318da14cebeSEric Cheng free(maxbw); 1319da14cebeSEric Cheng return (status); 1320da14cebeSEric Cheng } 1321da14cebeSEric Cheng 1322da14cebeSEric Cheng if ((*maxbw < MRP_MAXBW_MINVAL) && (*maxbw != 0)) { 1323da14cebeSEric Cheng free(maxbw); 1324da14cebeSEric Cheng return (DLADM_STATUS_MINMAXBW); 1325da14cebeSEric Cheng } 1326da14cebeSEric Cheng 1327da14cebeSEric Cheng vdp->vd_val = (uintptr_t)maxbw; 1328da14cebeSEric Cheng return (DLADM_STATUS_OK); 1329da14cebeSEric Cheng } 1330da14cebeSEric Cheng 1331da14cebeSEric Cheng /* ARGSUSED */ 1332da14cebeSEric Cheng dladm_status_t 1333da14cebeSEric Cheng do_extract_maxbw(val_desc_t *vdp, void *arg, uint_t cnt) 1334da14cebeSEric Cheng { 1335da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1336da14cebeSEric Cheng 1337da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_maxbw, sizeof (uint64_t)); 1338da14cebeSEric Cheng mrp->mrp_mask |= MRP_MAXBW; 1339da14cebeSEric Cheng 1340da14cebeSEric Cheng return (DLADM_STATUS_OK); 1341da14cebeSEric Cheng } 1342da14cebeSEric Cheng 1343da14cebeSEric Cheng /* ARGSUSED */ 1344da14cebeSEric Cheng static dladm_status_t 134562ee1d25SArtem Kachitchkine i_dladm_cpus_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1346da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1347da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1348da14cebeSEric Cheng { 1349da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1350da14cebeSEric Cheng mac_resource_props_t mrp; 1351da14cebeSEric Cheng int i; 1352da14cebeSEric Cheng uint32_t ncpus; 1353da14cebeSEric Cheng uchar_t *cp; 1354da14cebeSEric Cheng dladm_status_t status; 1355da14cebeSEric Cheng 13564ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1357da14cebeSEric Cheng &status, perm_flags); 1358da14cebeSEric Cheng if (dip == NULL) 1359da14cebeSEric Cheng return (status); 1360da14cebeSEric Cheng 1361da14cebeSEric Cheng cp = (uchar_t *)dip->pr_val; 1362da14cebeSEric Cheng (void) memcpy(&mrp, cp, sizeof (mac_resource_props_t)); 1363da14cebeSEric Cheng free(dip); 1364da14cebeSEric Cheng 1365da14cebeSEric Cheng ncpus = mrp.mrp_ncpus; 1366da14cebeSEric Cheng 1367da14cebeSEric Cheng if (ncpus > *val_cnt) 1368da14cebeSEric Cheng return (DLADM_STATUS_TOOSMALL); 1369da14cebeSEric Cheng 1370da14cebeSEric Cheng if (ncpus == 0) { 1371da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1372da14cebeSEric Cheng *val_cnt = 1; 1373da14cebeSEric Cheng return (DLADM_STATUS_OK); 1374da14cebeSEric Cheng } 1375da14cebeSEric Cheng 1376da14cebeSEric Cheng *val_cnt = ncpus; 1377da14cebeSEric Cheng for (i = 0; i < ncpus; i++) { 1378da14cebeSEric Cheng (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 1379da14cebeSEric Cheng "%u", mrp.mrp_cpu[i]); 1380da14cebeSEric Cheng } 1381da14cebeSEric Cheng return (DLADM_STATUS_OK); 1382da14cebeSEric Cheng } 1383da14cebeSEric Cheng 1384da14cebeSEric Cheng /* ARGSUSED */ 1385da14cebeSEric Cheng static dladm_status_t 13864ac67f02SAnurag S. Maskey do_set_res(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 13874ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1388da14cebeSEric Cheng { 1389da14cebeSEric Cheng mac_resource_props_t mrp; 1390da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1391da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1392da14cebeSEric Cheng 1393da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1394da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1395da14cebeSEric Cheng flags, &status); 1396da14cebeSEric Cheng 1397da14cebeSEric Cheng if (dip == NULL) 1398da14cebeSEric Cheng return (status); 1399da14cebeSEric Cheng 1400da14cebeSEric Cheng if (vdp->vd_val == RESET_VAL) { 1401da14cebeSEric Cheng switch (dip->pr_num) { 1402da14cebeSEric Cheng case MAC_PROP_MAXBW: 1403da14cebeSEric Cheng mrp.mrp_maxbw = MRP_MAXBW_RESETVAL; 1404da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1405da14cebeSEric Cheng break; 1406da14cebeSEric Cheng case MAC_PROP_PRIO: 1407da14cebeSEric Cheng mrp.mrp_priority = MPL_RESET; 1408da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1409da14cebeSEric Cheng break; 1410da14cebeSEric Cheng default: 1411da14cebeSEric Cheng free(dip); 1412da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1413da14cebeSEric Cheng } 1414da14cebeSEric Cheng } else { 1415da14cebeSEric Cheng switch (dip->pr_num) { 1416da14cebeSEric Cheng case MAC_PROP_MAXBW: 1417da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_maxbw, 1418da14cebeSEric Cheng sizeof (uint64_t)); 1419da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1420da14cebeSEric Cheng break; 1421da14cebeSEric Cheng case MAC_PROP_PRIO: 1422da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_priority, 1423da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1424da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1425da14cebeSEric Cheng break; 1426da14cebeSEric Cheng default: 1427da14cebeSEric Cheng free(dip); 1428da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1429da14cebeSEric Cheng } 1430da14cebeSEric Cheng } 1431da14cebeSEric Cheng 1432da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 14334ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1434da14cebeSEric Cheng free(dip); 1435da14cebeSEric Cheng return (status); 1436da14cebeSEric Cheng } 1437da14cebeSEric Cheng 1438da14cebeSEric Cheng /* ARGSUSED */ 1439da14cebeSEric Cheng static dladm_status_t 14404ac67f02SAnurag S. Maskey do_set_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14414ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1442da14cebeSEric Cheng { 1443da14cebeSEric Cheng mac_resource_props_t mrp; 1444da14cebeSEric Cheng dladm_status_t status; 1445da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1446da14cebeSEric Cheng datalink_class_t class; 1447da14cebeSEric Cheng 1448da14cebeSEric Cheng /* 1449da14cebeSEric Cheng * CPU bindings can be set on VNIC and regular physical links. 1450da14cebeSEric Cheng * However VNICs fails the dladm_phys_info test(). So apply 1451da14cebeSEric Cheng * the phys_info test only on physical links. 1452da14cebeSEric Cheng */ 14534ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, 1454da14cebeSEric Cheng NULL, NULL, 0)) != DLADM_STATUS_OK) { 1455da14cebeSEric Cheng return (status); 1456da14cebeSEric Cheng } 1457da14cebeSEric Cheng 1458da14cebeSEric Cheng /* 1459da14cebeSEric Cheng * We set intr_cpu to -1. The interrupt will be retargetted, 1460da14cebeSEric Cheng * if possible when the setup is complete in MAC. 1461da14cebeSEric Cheng */ 1462da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1463da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1464da14cebeSEric Cheng if (vdp != NULL && vdp->vd_val != RESET_VAL) { 1465da14cebeSEric Cheng mac_resource_props_t *vmrp; 1466da14cebeSEric Cheng 1467da14cebeSEric Cheng vmrp = (mac_resource_props_t *)vdp->vd_val; 1468da14cebeSEric Cheng if (vmrp->mrp_ncpus > 0) { 1469da14cebeSEric Cheng bcopy(vmrp, &mrp, sizeof (mac_resource_props_t)); 1470da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1471da14cebeSEric Cheng } 1472da14cebeSEric Cheng mrp.mrp_mask |= MRP_CPUS_USERSPEC; 1473da14cebeSEric Cheng mrp.mrp_fanout_mode = MCM_CPUS; 1474da14cebeSEric Cheng mrp.mrp_intr_cpu = -1; 1475da14cebeSEric Cheng } 1476da14cebeSEric Cheng 1477da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1478da14cebeSEric Cheng flags, &status); 1479da14cebeSEric Cheng if (dip == NULL) 1480da14cebeSEric Cheng return (status); 1481da14cebeSEric Cheng 1482da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 14834ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1484da14cebeSEric Cheng free(dip); 1485da14cebeSEric Cheng return (status); 1486da14cebeSEric Cheng } 1487da14cebeSEric Cheng 1488da14cebeSEric Cheng /* ARGSUSED */ 1489da14cebeSEric Cheng static dladm_status_t 14904ac67f02SAnurag S. Maskey do_check_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14914ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1492da14cebeSEric Cheng { 1493da14cebeSEric Cheng uint32_t cpuid; 1494da14cebeSEric Cheng int i, j, rc; 1495da14cebeSEric Cheng long nproc = sysconf(_SC_NPROCESSORS_CONF); 1496da14cebeSEric Cheng mac_resource_props_t *mrp; 1497da14cebeSEric Cheng 1498da14cebeSEric Cheng mrp = malloc(sizeof (mac_resource_props_t)); 1499da14cebeSEric Cheng if (mrp == NULL) 1500da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1501da14cebeSEric Cheng 1502da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1503da14cebeSEric Cheng errno = 0; 1504da14cebeSEric Cheng cpuid = strtol(prop_val[i], (char **)NULL, 10); 1505da14cebeSEric Cheng if (errno != 0 || cpuid >= nproc) { 1506da14cebeSEric Cheng free(mrp); 1507da14cebeSEric Cheng return (DLADM_STATUS_CPUMAX); 1508da14cebeSEric Cheng } 1509da14cebeSEric Cheng rc = p_online(cpuid, P_STATUS); 1510da14cebeSEric Cheng if (rc < 1) { 1511da14cebeSEric Cheng free(mrp); 1512da14cebeSEric Cheng return (DLADM_STATUS_CPUERR); 1513da14cebeSEric Cheng } 1514da14cebeSEric Cheng if (rc != P_ONLINE) { 1515da14cebeSEric Cheng free(mrp); 1516da14cebeSEric Cheng return (DLADM_STATUS_CPUNOTONLINE); 1517da14cebeSEric Cheng } 1518da14cebeSEric Cheng mrp->mrp_cpu[i] = cpuid; 1519da14cebeSEric Cheng } 1520da14cebeSEric Cheng mrp->mrp_ncpus = (uint32_t)val_cnt; 1521da14cebeSEric Cheng 1522da14cebeSEric Cheng /* Check for duplicates */ 1523da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1524da14cebeSEric Cheng for (j = 0; j < val_cnt; j++) { 1525da14cebeSEric Cheng if (i != j && mrp->mrp_cpu[i] == mrp->mrp_cpu[j]) { 1526da14cebeSEric Cheng free(mrp); 1527da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1528da14cebeSEric Cheng } 1529da14cebeSEric Cheng } 1530da14cebeSEric Cheng } 1531da14cebeSEric Cheng vdp->vd_val = (uintptr_t)mrp; 1532da14cebeSEric Cheng 1533da14cebeSEric Cheng return (DLADM_STATUS_OK); 1534da14cebeSEric Cheng } 1535da14cebeSEric Cheng 1536da14cebeSEric Cheng /* ARGSUSED */ 1537da14cebeSEric Cheng dladm_status_t 1538da14cebeSEric Cheng do_extract_cpus(val_desc_t *vdp, void *arg, uint_t cnt) 1539da14cebeSEric Cheng { 1540da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1541da14cebeSEric Cheng mac_resource_props_t *vmrp = (mac_resource_props_t *)vdp->vd_val; 1542da14cebeSEric Cheng int i; 1543da14cebeSEric Cheng 1544da14cebeSEric Cheng for (i = 0; i < vmrp->mrp_ncpus; i++) { 1545da14cebeSEric Cheng mrp->mrp_cpu[i] = vmrp->mrp_cpu[i]; 1546da14cebeSEric Cheng } 1547da14cebeSEric Cheng mrp->mrp_ncpus = vmrp->mrp_ncpus; 1548da14cebeSEric Cheng mrp->mrp_mask |= (MRP_CPUS|MRP_CPUS_USERSPEC); 1549da14cebeSEric Cheng mrp->mrp_fanout_mode = MCM_CPUS; 155063a6526dSMichael Lim mrp->mrp_intr_cpu = -1; 1551da14cebeSEric Cheng 1552da14cebeSEric Cheng return (DLADM_STATUS_OK); 1553da14cebeSEric Cheng } 1554da14cebeSEric Cheng 1555da14cebeSEric Cheng /* ARGSUSED */ 1556da14cebeSEric Cheng static dladm_status_t 155762ee1d25SArtem Kachitchkine i_dladm_priority_get(dladm_handle_t handle, prop_desc_t *pdp, 155862ee1d25SArtem Kachitchkine datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 155962ee1d25SArtem Kachitchkine datalink_media_t media, uint_t flags, uint_t *perm_flags) 1560da14cebeSEric Cheng { 1561da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1562da14cebeSEric Cheng mac_resource_props_t mrp; 1563da14cebeSEric Cheng mac_priority_level_t pri; 1564da14cebeSEric Cheng dladm_status_t status; 1565da14cebeSEric Cheng 15664ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1567da14cebeSEric Cheng &status, perm_flags); 1568da14cebeSEric Cheng if (dip == NULL) 1569da14cebeSEric Cheng return (status); 1570da14cebeSEric Cheng 1571da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1572da14cebeSEric Cheng free(dip); 1573da14cebeSEric Cheng 1574da14cebeSEric Cheng pri = ((mrp.mrp_mask & MRP_PRIORITY) == 0) ? MPL_HIGH : 1575da14cebeSEric Cheng mrp.mrp_priority; 1576da14cebeSEric Cheng 1577da14cebeSEric Cheng (void) dladm_pri2str(pri, prop_val[0]); 1578da14cebeSEric Cheng *val_cnt = 1; 1579da14cebeSEric Cheng return (DLADM_STATUS_OK); 1580da14cebeSEric Cheng } 1581da14cebeSEric Cheng 1582da14cebeSEric Cheng /* ARGSUSED */ 1583da14cebeSEric Cheng static dladm_status_t 15844ac67f02SAnurag S. Maskey do_check_priority(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 15854ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1586da14cebeSEric Cheng { 1587da14cebeSEric Cheng mac_priority_level_t *pri; 1588da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1589da14cebeSEric Cheng 1590da14cebeSEric Cheng if (val_cnt != 1) 1591da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1592da14cebeSEric Cheng 1593da14cebeSEric Cheng pri = malloc(sizeof (mac_priority_level_t)); 1594da14cebeSEric Cheng if (pri == NULL) 1595da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1596da14cebeSEric Cheng 1597da14cebeSEric Cheng status = dladm_str2pri(*prop_val, pri); 1598da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1599da14cebeSEric Cheng free(pri); 1600da14cebeSEric Cheng return (status); 1601da14cebeSEric Cheng } 1602da14cebeSEric Cheng 1603da14cebeSEric Cheng if (*pri < MPL_LOW || *pri > MPL_HIGH) { 1604da14cebeSEric Cheng free(pri); 1605da14cebeSEric Cheng return (DLADM_STATUS_BADVAL); 1606da14cebeSEric Cheng } 1607da14cebeSEric Cheng 1608da14cebeSEric Cheng vdp->vd_val = (uintptr_t)pri; 1609da14cebeSEric Cheng return (DLADM_STATUS_OK); 1610da14cebeSEric Cheng } 1611da14cebeSEric Cheng 1612da14cebeSEric Cheng /* ARGSUSED */ 1613da14cebeSEric Cheng dladm_status_t 1614da14cebeSEric Cheng do_extract_priority(val_desc_t *vdp, void *arg, uint_t cnt) 1615da14cebeSEric Cheng { 1616da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1617da14cebeSEric Cheng 1618da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_priority, 1619da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1620da14cebeSEric Cheng mrp->mrp_mask |= MRP_PRIORITY; 1621da14cebeSEric Cheng 1622da14cebeSEric Cheng return (DLADM_STATUS_OK); 1623da14cebeSEric Cheng } 1624da14cebeSEric Cheng 1625da14cebeSEric Cheng /* ARGSUSED */ 1626da14cebeSEric Cheng static dladm_status_t 16274ac67f02SAnurag S. Maskey do_get_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1628da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1629da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1630d62bc4baSyz147064 { 16313bc21d0aSAruna Ramakrishna - Sun Microsystems struct dlautopush dlap; 16323bc21d0aSAruna Ramakrishna - Sun Microsystems int i, len; 16333bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status; 16343bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1635d62bc4baSyz147064 16363fd94f8cSam223141 if (flags & MAC_PROP_DEFAULT) 1637149b7eb2SSowmini Varadhan return (DLADM_STATUS_NOTDEFINED); 16384045d941Ssowmini 1639d62bc4baSyz147064 *val_cnt = 1; 16404ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1641da14cebeSEric Cheng &status, perm_flags); 16423bc21d0aSAruna Ramakrishna - Sun Microsystems if (dip == NULL) { 1643d62bc4baSyz147064 (*prop_val)[0] = '\0'; 1644da14cebeSEric Cheng return (DLADM_STATUS_OK); 1645d62bc4baSyz147064 } 16463bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&dlap, dip->pr_val, sizeof (dlap)); 1647d62bc4baSyz147064 16483bc21d0aSAruna Ramakrishna - Sun Microsystems for (i = 0, len = 0; i < dlap.dap_npush; i++) { 1649d62bc4baSyz147064 if (i != 0) { 1650d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1651d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c", AP_DELIMITER); 1652d62bc4baSyz147064 len += 1; 1653d62bc4baSyz147064 } 1654d62bc4baSyz147064 (void) snprintf(*prop_val + len, DLADM_PROP_VAL_MAX - len, 16553bc21d0aSAruna Ramakrishna - Sun Microsystems "%s", dlap.dap_aplist[i]); 16563bc21d0aSAruna Ramakrishna - Sun Microsystems len += strlen(dlap.dap_aplist[i]); 16573bc21d0aSAruna Ramakrishna - Sun Microsystems if (dlap.dap_anchor - 1 == i) { 1658d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1659d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c%s", AP_DELIMITER, 1660d62bc4baSyz147064 AP_ANCHOR); 1661d62bc4baSyz147064 len += (strlen(AP_ANCHOR) + 1); 1662d62bc4baSyz147064 } 1663d62bc4baSyz147064 } 16643bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1665d62bc4baSyz147064 done: 1666d62bc4baSyz147064 return (DLADM_STATUS_OK); 1667d62bc4baSyz147064 } 1668d62bc4baSyz147064 1669d62bc4baSyz147064 /* 1670d62bc4baSyz147064 * Add the specified module to the dlautopush structure; returns a 1671d62bc4baSyz147064 * DLADM_STATUS_* code. 1672d62bc4baSyz147064 */ 1673d62bc4baSyz147064 dladm_status_t 1674d62bc4baSyz147064 i_dladm_add_ap_module(const char *module, struct dlautopush *dlap) 1675d62bc4baSyz147064 { 1676d62bc4baSyz147064 if ((strlen(module) == 0) || (strlen(module) > FMNAMESZ)) 1677d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1678d62bc4baSyz147064 1679d62bc4baSyz147064 if (strncasecmp(module, AP_ANCHOR, strlen(AP_ANCHOR)) == 0) { 1680d62bc4baSyz147064 /* 1681d62bc4baSyz147064 * We don't allow multiple anchors, and the anchor must 1682d62bc4baSyz147064 * be after at least one module. 1683d62bc4baSyz147064 */ 1684d62bc4baSyz147064 if (dlap->dap_anchor != 0) 1685d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1686d62bc4baSyz147064 if (dlap->dap_npush == 0) 1687d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1688d62bc4baSyz147064 1689d62bc4baSyz147064 dlap->dap_anchor = dlap->dap_npush; 1690d62bc4baSyz147064 return (DLADM_STATUS_OK); 1691d62bc4baSyz147064 } 1692285e94f9SMichael Lim if (dlap->dap_npush >= MAXAPUSH) 1693d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1694d62bc4baSyz147064 1695d62bc4baSyz147064 (void) strlcpy(dlap->dap_aplist[dlap->dap_npush++], module, 1696d62bc4baSyz147064 FMNAMESZ + 1); 1697d62bc4baSyz147064 1698d62bc4baSyz147064 return (DLADM_STATUS_OK); 1699d62bc4baSyz147064 } 1700d62bc4baSyz147064 1701d62bc4baSyz147064 /* 1702d62bc4baSyz147064 * Currently, both '.' and ' '(space) can be used as the delimiters between 1703d62bc4baSyz147064 * autopush modules. The former is used in dladm set-linkprop, and the 1704d62bc4baSyz147064 * latter is used in the autopush(1M) file. 1705d62bc4baSyz147064 */ 1706d62bc4baSyz147064 /* ARGSUSED */ 1707d62bc4baSyz147064 static dladm_status_t 17084ac67f02SAnurag S. Maskey do_check_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 17094ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1710d62bc4baSyz147064 { 1711d62bc4baSyz147064 char *module; 1712d62bc4baSyz147064 struct dlautopush *dlap; 1713d62bc4baSyz147064 dladm_status_t status; 1714d62bc4baSyz147064 char val[DLADM_PROP_VAL_MAX]; 1715d62bc4baSyz147064 char delimiters[4]; 1716d62bc4baSyz147064 1717d62bc4baSyz147064 if (val_cnt != 1) 1718d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1719d62bc4baSyz147064 17203bc21d0aSAruna Ramakrishna - Sun Microsystems if (prop_val != NULL) { 1721d62bc4baSyz147064 dlap = malloc(sizeof (struct dlautopush)); 1722d62bc4baSyz147064 if (dlap == NULL) 1723d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 1724d62bc4baSyz147064 1725d62bc4baSyz147064 (void) memset(dlap, 0, sizeof (struct dlautopush)); 1726d62bc4baSyz147064 (void) snprintf(delimiters, 4, " %c\n", AP_DELIMITER); 1727d62bc4baSyz147064 bcopy(*prop_val, val, DLADM_PROP_VAL_MAX); 1728d62bc4baSyz147064 module = strtok(val, delimiters); 1729d62bc4baSyz147064 while (module != NULL) { 1730d62bc4baSyz147064 status = i_dladm_add_ap_module(module, dlap); 1731d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1732d62bc4baSyz147064 return (status); 1733d62bc4baSyz147064 module = strtok(NULL, delimiters); 1734d62bc4baSyz147064 } 1735d62bc4baSyz147064 1736d62bc4baSyz147064 vdp->vd_val = (uintptr_t)dlap; 17373bc21d0aSAruna Ramakrishna - Sun Microsystems } else { 17383bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = 0; 17393bc21d0aSAruna Ramakrishna - Sun Microsystems } 1740d62bc4baSyz147064 return (DLADM_STATUS_OK); 1741d62bc4baSyz147064 } 1742d62bc4baSyz147064 1743bcb5c89dSSowmini Varadhan #define WLDP_BUFSIZE (MAX_BUF_LEN - WIFI_BUF_OFFSET) 1744bcb5c89dSSowmini Varadhan 1745e7801d59Ssowmini /* ARGSUSED */ 1746d62bc4baSyz147064 static dladm_status_t 17474ac67f02SAnurag S. Maskey do_get_rate_common(dladm_handle_t handle, prop_desc_t *pdp, 17484ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id, 17494ac67f02SAnurag S. Maskey uint_t *perm_flags) 1750d62bc4baSyz147064 { 1751d62bc4baSyz147064 wl_rates_t *wrp; 1752d62bc4baSyz147064 uint_t i; 1753d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1754d62bc4baSyz147064 1755bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 1756bcb5c89dSSowmini Varadhan if (wrp == NULL) 1757bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 1758d62bc4baSyz147064 17594ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE, 17604ac67f02SAnurag S. Maskey B_FALSE); 1761d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1762d62bc4baSyz147064 goto done; 1763d62bc4baSyz147064 1764d62bc4baSyz147064 if (wrp->wl_rates_num > *val_cnt) { 1765d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 1766d62bc4baSyz147064 goto done; 1767d62bc4baSyz147064 } 1768d62bc4baSyz147064 1769d62bc4baSyz147064 if (wrp->wl_rates_rates[0] == 0) { 1770d62bc4baSyz147064 prop_val[0][0] = '\0'; 1771d62bc4baSyz147064 *val_cnt = 1; 1772d62bc4baSyz147064 goto done; 1773d62bc4baSyz147064 } 1774d62bc4baSyz147064 1775d62bc4baSyz147064 for (i = 0; i < wrp->wl_rates_num; i++) { 1776d62bc4baSyz147064 (void) snprintf(prop_val[i], DLADM_STRSIZE, "%.*f", 1777d62bc4baSyz147064 wrp->wl_rates_rates[i] % 2, 1778d62bc4baSyz147064 (float)wrp->wl_rates_rates[i] / 2); 1779d62bc4baSyz147064 } 1780d62bc4baSyz147064 *val_cnt = wrp->wl_rates_num; 1781da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_RW; 1782d62bc4baSyz147064 1783d62bc4baSyz147064 done: 1784bcb5c89dSSowmini Varadhan free(wrp); 1785d62bc4baSyz147064 return (status); 1786d62bc4baSyz147064 } 1787d62bc4baSyz147064 1788d62bc4baSyz147064 static dladm_status_t 17894ac67f02SAnurag S. Maskey do_get_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1790da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1791da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1792d62bc4baSyz147064 { 1793afdda45fSVasumathi Sundaram - Sun Microsystems if (media != DL_WIFI) { 17944ac67f02SAnurag S. Maskey return (i_dladm_speed_get(handle, pdp, linkid, prop_val, 1795da14cebeSEric Cheng val_cnt, flags, perm_flags)); 1796afdda45fSVasumathi Sundaram - Sun Microsystems } 17976b9e797cSsowmini 17984ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, val_cnt, 1799da14cebeSEric Cheng MAC_PROP_WL_DESIRED_RATES, perm_flags)); 1800d62bc4baSyz147064 } 1801d62bc4baSyz147064 18024045d941Ssowmini /* ARGSUSED */ 1803d62bc4baSyz147064 static dladm_status_t 18044ac67f02SAnurag S. Maskey do_get_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1805da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1806da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1807d62bc4baSyz147064 { 18086b9e797cSsowmini switch (media) { 18096b9e797cSsowmini case DL_ETHER: 18104045d941Ssowmini /* 18114045d941Ssowmini * Speed for ethernet links is unbounded. E.g., 802.11b 18124045d941Ssowmini * links can have a speed of 5.5 Gbps. 18134045d941Ssowmini */ 18144045d941Ssowmini return (DLADM_STATUS_NOTSUP); 18156b9e797cSsowmini 18166b9e797cSsowmini case DL_WIFI: 18174ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, 18184ac67f02SAnurag S. Maskey val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); 18196b9e797cSsowmini default: 18206b9e797cSsowmini return (DLADM_STATUS_BADARG); 18216b9e797cSsowmini } 1822d62bc4baSyz147064 } 1823d62bc4baSyz147064 1824d62bc4baSyz147064 static dladm_status_t 18254ac67f02SAnurag S. Maskey do_set_rate(dladm_handle_t handle, datalink_id_t linkid, 18264ac67f02SAnurag S. Maskey dladm_wlan_rates_t *rates) 1827f4b3ec61Sdh155122 { 1828f4b3ec61Sdh155122 int i; 1829d62bc4baSyz147064 uint_t len; 1830d62bc4baSyz147064 wl_rates_t *wrp; 1831d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1832d62bc4baSyz147064 1833bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 1834bcb5c89dSSowmini Varadhan if (wrp == NULL) 1835d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 1836d62bc4baSyz147064 1837bcb5c89dSSowmini Varadhan bzero(wrp, WLDP_BUFSIZE); 1838d62bc4baSyz147064 for (i = 0; i < rates->wr_cnt; i++) 1839d62bc4baSyz147064 wrp->wl_rates_rates[i] = rates->wr_rates[i]; 1840d62bc4baSyz147064 wrp->wl_rates_num = rates->wr_cnt; 1841d62bc4baSyz147064 1842d62bc4baSyz147064 len = offsetof(wl_rates_t, wl_rates_rates) + 1843d62bc4baSyz147064 (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; 18444ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, 18454ac67f02SAnurag S. Maskey MAC_PROP_WL_DESIRED_RATES, len, B_TRUE); 1846d62bc4baSyz147064 1847bcb5c89dSSowmini Varadhan free(wrp); 1848d62bc4baSyz147064 return (status); 1849d62bc4baSyz147064 } 1850d62bc4baSyz147064 1851e7801d59Ssowmini /* ARGSUSED */ 1852d62bc4baSyz147064 static dladm_status_t 18534ac67f02SAnurag S. Maskey do_set_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 18546b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1855d62bc4baSyz147064 { 1856d62bc4baSyz147064 dladm_wlan_rates_t rates; 1857f4b3ec61Sdh155122 dladm_status_t status; 1858f4b3ec61Sdh155122 18596b9e797cSsowmini /* 18606b9e797cSsowmini * can currently set rate on WIFI links only. 18616b9e797cSsowmini */ 18626b9e797cSsowmini if (media != DL_WIFI) 18636b9e797cSsowmini return (DLADM_STATUS_PROPRDONLY); 18646b9e797cSsowmini 1865d62bc4baSyz147064 if (val_cnt != 1) 1866d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1867f4b3ec61Sdh155122 1868d62bc4baSyz147064 rates.wr_cnt = 1; 1869d62bc4baSyz147064 rates.wr_rates[0] = vdp[0].vd_val; 1870f4b3ec61Sdh155122 18714ac67f02SAnurag S. Maskey status = do_set_rate(handle, linkid, &rates); 1872f4b3ec61Sdh155122 1873d62bc4baSyz147064 done: 1874d62bc4baSyz147064 return (status); 1875d62bc4baSyz147064 } 1876d62bc4baSyz147064 1877d62bc4baSyz147064 /* ARGSUSED */ 1878d62bc4baSyz147064 static dladm_status_t 18794ac67f02SAnurag S. Maskey do_check_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 18804ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1881d62bc4baSyz147064 { 1882d62bc4baSyz147064 int i; 1883d62bc4baSyz147064 uint_t modval_cnt = MAX_SUPPORT_RATES; 1884d62bc4baSyz147064 char *buf, **modval; 1885d62bc4baSyz147064 dladm_status_t status; 1886afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 1887d62bc4baSyz147064 1888d62bc4baSyz147064 if (val_cnt != 1) 1889d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1890d62bc4baSyz147064 1891d62bc4baSyz147064 buf = malloc((sizeof (char *) + DLADM_STRSIZE) * 1892d62bc4baSyz147064 MAX_SUPPORT_RATES); 1893d62bc4baSyz147064 if (buf == NULL) { 1894d62bc4baSyz147064 status = DLADM_STATUS_NOMEM; 1895d62bc4baSyz147064 goto done; 1896d62bc4baSyz147064 } 1897d62bc4baSyz147064 1898d62bc4baSyz147064 modval = (char **)(void *)buf; 1899d62bc4baSyz147064 for (i = 0; i < MAX_SUPPORT_RATES; i++) { 1900d62bc4baSyz147064 modval[i] = buf + sizeof (char *) * MAX_SUPPORT_RATES + 1901d62bc4baSyz147064 i * DLADM_STRSIZE; 1902d62bc4baSyz147064 } 1903d62bc4baSyz147064 19044ac67f02SAnurag S. Maskey status = do_get_rate_mod(handle, NULL, linkid, modval, &modval_cnt, 19054ac67f02SAnurag S. Maskey media, 0, &perm_flags); 1906d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1907d62bc4baSyz147064 goto done; 1908d62bc4baSyz147064 1909d62bc4baSyz147064 for (i = 0; i < modval_cnt; i++) { 1910d62bc4baSyz147064 if (strcasecmp(*prop_val, modval[i]) == 0) { 1911e7801d59Ssowmini vdp->vd_val = (uintptr_t)(uint_t) 1912e7801d59Ssowmini (atof(*prop_val) * 2); 1913f4b3ec61Sdh155122 status = DLADM_STATUS_OK; 1914f4b3ec61Sdh155122 break; 1915f4b3ec61Sdh155122 } 1916d62bc4baSyz147064 } 1917d62bc4baSyz147064 if (i == modval_cnt) 1918d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 1919d62bc4baSyz147064 done: 1920d62bc4baSyz147064 free(buf); 1921d62bc4baSyz147064 return (status); 1922d62bc4baSyz147064 } 1923f4b3ec61Sdh155122 1924d62bc4baSyz147064 static dladm_status_t 19254ac67f02SAnurag S. Maskey do_get_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf, 19264ac67f02SAnurag S. Maskey int buflen) 1927d62bc4baSyz147064 { 19284ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, 1929bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 1930d62bc4baSyz147064 } 1931d62bc4baSyz147064 1932e7801d59Ssowmini /* ARGSUSED */ 1933d62bc4baSyz147064 static dladm_status_t 19344ac67f02SAnurag S. Maskey do_get_channel_prop(dladm_handle_t handle, prop_desc_t *pdp, 19354ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 19364ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 1937d62bc4baSyz147064 { 1938d62bc4baSyz147064 uint32_t channel; 1939bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 1940d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1941bcb5c89dSSowmini Varadhan wl_phy_conf_t wl_phy_conf; 1942d62bc4baSyz147064 19434ac67f02SAnurag S. Maskey if ((status = do_get_phyconf(handle, linkid, buf, sizeof (buf))) 1944bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 1945d62bc4baSyz147064 goto done; 1946d62bc4baSyz147064 1947bcb5c89dSSowmini Varadhan (void) memcpy(&wl_phy_conf, buf, sizeof (wl_phy_conf)); 1948bcb5c89dSSowmini Varadhan if (!i_dladm_wlan_convert_chan(&wl_phy_conf, &channel)) { 1949d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 1950d62bc4baSyz147064 goto done; 1951d62bc4baSyz147064 } 1952d62bc4baSyz147064 1953d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel); 1954d62bc4baSyz147064 *val_cnt = 1; 1955da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 1956d62bc4baSyz147064 done: 1957d62bc4baSyz147064 return (status); 1958d62bc4baSyz147064 } 1959d62bc4baSyz147064 1960d62bc4baSyz147064 static dladm_status_t 19614ac67f02SAnurag S. Maskey do_get_powermode(dladm_handle_t handle, datalink_id_t linkid, void *buf, 19624ac67f02SAnurag S. Maskey int buflen) 1963d62bc4baSyz147064 { 19644ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_POWER_MODE, 1965bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 1966d62bc4baSyz147064 } 1967d62bc4baSyz147064 1968e7801d59Ssowmini /* ARGSUSED */ 1969d62bc4baSyz147064 static dladm_status_t 19704ac67f02SAnurag S. Maskey do_get_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 19714ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 19724ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 1973d62bc4baSyz147064 { 1974bcb5c89dSSowmini Varadhan wl_ps_mode_t mode; 1975d62bc4baSyz147064 const char *s; 1976bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 1977d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1978d62bc4baSyz147064 19794ac67f02SAnurag S. Maskey if ((status = do_get_powermode(handle, linkid, buf, sizeof (buf))) 1980bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 1981d62bc4baSyz147064 goto done; 1982d62bc4baSyz147064 1983bcb5c89dSSowmini Varadhan (void) memcpy(&mode, buf, sizeof (mode)); 1984bcb5c89dSSowmini Varadhan switch (mode.wl_ps_mode) { 1985d62bc4baSyz147064 case WL_PM_AM: 1986d62bc4baSyz147064 s = "off"; 1987f4b3ec61Sdh155122 break; 1988d62bc4baSyz147064 case WL_PM_MPS: 1989d62bc4baSyz147064 s = "max"; 1990d62bc4baSyz147064 break; 1991d62bc4baSyz147064 case WL_PM_FAST: 1992d62bc4baSyz147064 s = "fast"; 1993f4b3ec61Sdh155122 break; 1994f4b3ec61Sdh155122 default: 1995d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 1996d62bc4baSyz147064 goto done; 1997f4b3ec61Sdh155122 } 1998d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 1999d62bc4baSyz147064 *val_cnt = 1; 2000afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2001da14cebeSEric Cheng done: 2002d62bc4baSyz147064 return (status); 2003d62bc4baSyz147064 } 2004d62bc4baSyz147064 2005d62bc4baSyz147064 static dladm_status_t 20064ac67f02SAnurag S. Maskey do_set_powermode(dladm_handle_t handle, datalink_id_t linkid, 20074ac67f02SAnurag S. Maskey dladm_wlan_powermode_t *pm) 2008d62bc4baSyz147064 { 2009d62bc4baSyz147064 wl_ps_mode_t ps_mode; 2010d62bc4baSyz147064 2011d62bc4baSyz147064 (void) memset(&ps_mode, 0xff, sizeof (ps_mode)); 2012d62bc4baSyz147064 2013d62bc4baSyz147064 switch (*pm) { 2014d62bc4baSyz147064 case DLADM_WLAN_PM_OFF: 2015d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_AM; 2016d62bc4baSyz147064 break; 2017d62bc4baSyz147064 case DLADM_WLAN_PM_MAX: 2018d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_MPS; 2019d62bc4baSyz147064 break; 2020d62bc4baSyz147064 case DLADM_WLAN_PM_FAST: 2021d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_FAST; 2022d62bc4baSyz147064 break; 2023d62bc4baSyz147064 default: 2024d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2025d62bc4baSyz147064 } 20264ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &ps_mode, 20274ac67f02SAnurag S. Maskey MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE)); 2028d62bc4baSyz147064 } 2029d62bc4baSyz147064 2030d62bc4baSyz147064 /* ARGSUSED */ 2031d62bc4baSyz147064 static dladm_status_t 20324ac67f02SAnurag S. Maskey do_set_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 20334ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 20344ac67f02SAnurag S. Maskey datalink_media_t media) 2035d62bc4baSyz147064 { 2036d62bc4baSyz147064 dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; 2037d62bc4baSyz147064 dladm_status_t status; 2038d62bc4baSyz147064 2039d62bc4baSyz147064 if (val_cnt != 1) 2040d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2041d62bc4baSyz147064 20424ac67f02SAnurag S. Maskey status = do_set_powermode(handle, linkid, &powermode); 2043f4b3ec61Sdh155122 2044f4b3ec61Sdh155122 return (status); 2045f4b3ec61Sdh155122 } 2046f4b3ec61Sdh155122 2047f4b3ec61Sdh155122 static dladm_status_t 20484ac67f02SAnurag S. Maskey do_get_radio(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) 2049f4b3ec61Sdh155122 { 20504ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RADIO, 20514ac67f02SAnurag S. Maskey buflen, B_FALSE)); 2052d62bc4baSyz147064 } 2053d62bc4baSyz147064 2054e7801d59Ssowmini /* ARGSUSED */ 2055d62bc4baSyz147064 static dladm_status_t 20564ac67f02SAnurag S. Maskey do_get_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2057da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2058da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2059d62bc4baSyz147064 { 2060d62bc4baSyz147064 wl_radio_t radio; 2061d62bc4baSyz147064 const char *s; 2062bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2063d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2064d62bc4baSyz147064 20654ac67f02SAnurag S. Maskey if ((status = do_get_radio(handle, linkid, buf, sizeof (buf))) 2066bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2067d62bc4baSyz147064 goto done; 2068d62bc4baSyz147064 2069bcb5c89dSSowmini Varadhan (void) memcpy(&radio, buf, sizeof (radio)); 2070d62bc4baSyz147064 switch (radio) { 2071d62bc4baSyz147064 case B_TRUE: 2072d62bc4baSyz147064 s = "on"; 2073d62bc4baSyz147064 break; 2074d62bc4baSyz147064 case B_FALSE: 2075d62bc4baSyz147064 s = "off"; 2076d62bc4baSyz147064 break; 2077d62bc4baSyz147064 default: 2078d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2079d62bc4baSyz147064 goto done; 2080d62bc4baSyz147064 } 2081d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2082d62bc4baSyz147064 *val_cnt = 1; 2083afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2084da14cebeSEric Cheng done: 2085d62bc4baSyz147064 return (status); 2086d62bc4baSyz147064 } 2087d62bc4baSyz147064 2088d62bc4baSyz147064 static dladm_status_t 20894ac67f02SAnurag S. Maskey do_set_radio(dladm_handle_t handle, datalink_id_t linkid, 20904ac67f02SAnurag S. Maskey dladm_wlan_radio_t *radio) 2091d62bc4baSyz147064 { 2092d62bc4baSyz147064 wl_radio_t r; 2093d62bc4baSyz147064 2094d62bc4baSyz147064 switch (*radio) { 2095d62bc4baSyz147064 case DLADM_WLAN_RADIO_ON: 2096d62bc4baSyz147064 r = B_TRUE; 2097d62bc4baSyz147064 break; 2098d62bc4baSyz147064 case DLADM_WLAN_RADIO_OFF: 2099d62bc4baSyz147064 r = B_FALSE; 2100d62bc4baSyz147064 break; 2101d62bc4baSyz147064 default: 2102d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2103d62bc4baSyz147064 } 21044ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO, 2105bcb5c89dSSowmini Varadhan sizeof (r), B_TRUE)); 2106d62bc4baSyz147064 } 2107d62bc4baSyz147064 2108d62bc4baSyz147064 /* ARGSUSED */ 2109d62bc4baSyz147064 static dladm_status_t 21104ac67f02SAnurag S. Maskey do_set_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 21116b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t fags, datalink_media_t media) 2112d62bc4baSyz147064 { 2113d62bc4baSyz147064 dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; 2114f4b3ec61Sdh155122 dladm_status_t status; 2115f4b3ec61Sdh155122 2116d62bc4baSyz147064 if (val_cnt != 1) 2117d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2118f4b3ec61Sdh155122 21194ac67f02SAnurag S. Maskey status = do_set_radio(handle, linkid, &radio); 2120f4b3ec61Sdh155122 2121d62bc4baSyz147064 return (status); 2122d62bc4baSyz147064 } 2123f4b3ec61Sdh155122 2124d62bc4baSyz147064 static dladm_status_t 21254ac67f02SAnurag S. Maskey i_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 21264ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt) 2127d62bc4baSyz147064 { 2128d62bc4baSyz147064 char buf[MAXLINELEN]; 2129d62bc4baSyz147064 int i; 2130d62bc4baSyz147064 dladm_conf_t conf; 2131d62bc4baSyz147064 dladm_status_t status; 2132d62bc4baSyz147064 21334ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2134f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 2135f4b3ec61Sdh155122 return (status); 2136f4b3ec61Sdh155122 2137d62bc4baSyz147064 /* 2138d62bc4baSyz147064 * reset case. 2139d62bc4baSyz147064 */ 2140d62bc4baSyz147064 if (val_cnt == 0) { 21414ac67f02SAnurag S. Maskey status = dladm_unset_conf_field(handle, conf, prop_name); 2142d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 21434ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2144d62bc4baSyz147064 goto done; 2145f4b3ec61Sdh155122 } 2146f4b3ec61Sdh155122 2147d62bc4baSyz147064 buf[0] = '\0'; 2148d62bc4baSyz147064 for (i = 0; i < val_cnt; i++) { 2149d62bc4baSyz147064 (void) strlcat(buf, prop_val[i], MAXLINELEN); 2150d62bc4baSyz147064 if (i != val_cnt - 1) 2151d62bc4baSyz147064 (void) strlcat(buf, ",", MAXLINELEN); 2152d62bc4baSyz147064 } 2153f4b3ec61Sdh155122 21544ac67f02SAnurag S. Maskey status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR, 21554ac67f02SAnurag S. Maskey buf); 2156d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 21574ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2158d62bc4baSyz147064 2159d62bc4baSyz147064 done: 21604ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2161f4b3ec61Sdh155122 return (status); 2162f4b3ec61Sdh155122 } 2163f4b3ec61Sdh155122 2164f4b3ec61Sdh155122 static dladm_status_t 21654ac67f02SAnurag S. Maskey i_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 21664ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cntp) 2167f4b3ec61Sdh155122 { 2168d62bc4baSyz147064 char buf[MAXLINELEN], *str; 2169d62bc4baSyz147064 uint_t cnt = 0; 2170d62bc4baSyz147064 dladm_conf_t conf; 2171d62bc4baSyz147064 dladm_status_t status; 2172f4b3ec61Sdh155122 21734ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2174d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2175f4b3ec61Sdh155122 return (status); 2176d62bc4baSyz147064 21774ac67f02SAnurag S. Maskey status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN); 2178d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2179d62bc4baSyz147064 goto done; 2180d62bc4baSyz147064 2181d62bc4baSyz147064 str = strtok(buf, ","); 2182d62bc4baSyz147064 while (str != NULL) { 2183d62bc4baSyz147064 if (cnt == *val_cntp) { 2184d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2185d62bc4baSyz147064 goto done; 2186d62bc4baSyz147064 } 2187d62bc4baSyz147064 (void) strlcpy(prop_val[cnt++], str, DLADM_PROP_VAL_MAX); 2188d62bc4baSyz147064 str = strtok(NULL, ","); 2189f4b3ec61Sdh155122 } 2190f4b3ec61Sdh155122 2191d62bc4baSyz147064 *val_cntp = cnt; 2192f4b3ec61Sdh155122 2193d62bc4baSyz147064 done: 21944ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2195d62bc4baSyz147064 return (status); 2196f4b3ec61Sdh155122 } 2197e7801d59Ssowmini 219862ee1d25SArtem Kachitchkine /* 219962ee1d25SArtem Kachitchkine * Walk persistent private link properties of a link. 220062ee1d25SArtem Kachitchkine */ 220162ee1d25SArtem Kachitchkine static dladm_status_t 220262ee1d25SArtem Kachitchkine i_dladm_walk_linkprop_priv_db(dladm_handle_t handle, datalink_id_t linkid, 220362ee1d25SArtem Kachitchkine void *arg, int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 220462ee1d25SArtem Kachitchkine { 220562ee1d25SArtem Kachitchkine dladm_status_t status; 220662ee1d25SArtem Kachitchkine dladm_conf_t conf; 220762ee1d25SArtem Kachitchkine char last_attr[MAXLINKATTRLEN]; 220862ee1d25SArtem Kachitchkine char attr[MAXLINKATTRLEN]; 220962ee1d25SArtem Kachitchkine char attrval[MAXLINKATTRVALLEN]; 221062ee1d25SArtem Kachitchkine size_t attrsz; 221162ee1d25SArtem Kachitchkine 221262ee1d25SArtem Kachitchkine if (linkid == DATALINK_INVALID_LINKID || func == NULL) 221362ee1d25SArtem Kachitchkine return (DLADM_STATUS_BADARG); 221462ee1d25SArtem Kachitchkine 221562ee1d25SArtem Kachitchkine status = dladm_read_conf(handle, linkid, &conf); 221662ee1d25SArtem Kachitchkine if (status != DLADM_STATUS_OK) 221762ee1d25SArtem Kachitchkine return (status); 221862ee1d25SArtem Kachitchkine 221962ee1d25SArtem Kachitchkine last_attr[0] = '\0'; 222062ee1d25SArtem Kachitchkine while ((status = dladm_getnext_conf_linkprop(handle, conf, last_attr, 222162ee1d25SArtem Kachitchkine attr, attrval, MAXLINKATTRVALLEN, &attrsz)) == DLADM_STATUS_OK) { 222262ee1d25SArtem Kachitchkine if (attr[0] == '_') { 222362ee1d25SArtem Kachitchkine if (func(handle, linkid, attr, arg) == 222462ee1d25SArtem Kachitchkine DLADM_WALK_TERMINATE) 222562ee1d25SArtem Kachitchkine break; 222662ee1d25SArtem Kachitchkine } 222762ee1d25SArtem Kachitchkine (void) strlcpy(last_attr, attr, MAXLINKATTRLEN); 222862ee1d25SArtem Kachitchkine } 222962ee1d25SArtem Kachitchkine 223062ee1d25SArtem Kachitchkine dladm_destroy_conf(handle, conf); 223162ee1d25SArtem Kachitchkine return (DLADM_STATUS_OK); 223262ee1d25SArtem Kachitchkine } 223362ee1d25SArtem Kachitchkine 2234bcb5c89dSSowmini Varadhan static link_attr_t * 2235e7801d59Ssowmini dladm_name2prop(const char *prop_name) 2236e7801d59Ssowmini { 2237bcb5c89dSSowmini Varadhan link_attr_t *p; 2238e7801d59Ssowmini 2239bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2240e7801d59Ssowmini if (strcmp(p->pp_name, prop_name) == 0) 2241e7801d59Ssowmini break; 2242e7801d59Ssowmini } 2243e7801d59Ssowmini return (p); 2244e7801d59Ssowmini } 2245e7801d59Ssowmini 2246bcb5c89dSSowmini Varadhan static link_attr_t * 2247bcb5c89dSSowmini Varadhan dladm_id2prop(mac_prop_id_t propid) 2248bcb5c89dSSowmini Varadhan { 2249bcb5c89dSSowmini Varadhan link_attr_t *p; 2250bcb5c89dSSowmini Varadhan 2251bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2252bcb5c89dSSowmini Varadhan if (p->pp_id == propid) 2253bcb5c89dSSowmini Varadhan break; 2254bcb5c89dSSowmini Varadhan } 2255bcb5c89dSSowmini Varadhan return (p); 2256bcb5c89dSSowmini Varadhan } 2257e7801d59Ssowmini 22583fd94f8cSam223141 static dld_ioc_macprop_t * 2259bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_impl(size_t valsize, datalink_id_t linkid, 2260bcb5c89dSSowmini Varadhan const char *prop_name, mac_prop_id_t propid, uint_t flags, 2261bcb5c89dSSowmini Varadhan dladm_status_t *status) 2262e7801d59Ssowmini { 2263e7801d59Ssowmini int dsize; 22643fd94f8cSam223141 dld_ioc_macprop_t *dip; 2265e7801d59Ssowmini 2266e7801d59Ssowmini *status = DLADM_STATUS_OK; 22673fd94f8cSam223141 dsize = MAC_PROP_BUFSIZE(valsize); 2268e7801d59Ssowmini dip = malloc(dsize); 2269e7801d59Ssowmini if (dip == NULL) { 2270e7801d59Ssowmini *status = DLADM_STATUS_NOMEM; 2271e7801d59Ssowmini return (NULL); 2272e7801d59Ssowmini } 2273e7801d59Ssowmini bzero(dip, dsize); 2274e7801d59Ssowmini dip->pr_valsize = valsize; 22754045d941Ssowmini (void) strlcpy(dip->pr_name, prop_name, sizeof (dip->pr_name)); 22763fd94f8cSam223141 dip->pr_version = MAC_PROP_VERSION; 22776b9e797cSsowmini dip->pr_linkid = linkid; 2278bcb5c89dSSowmini Varadhan dip->pr_num = propid; 22794045d941Ssowmini dip->pr_flags = flags; 2280e7801d59Ssowmini return (dip); 2281e7801d59Ssowmini } 2282e7801d59Ssowmini 2283bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2284bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_name(size_t valsize, datalink_id_t linkid, 2285bcb5c89dSSowmini Varadhan const char *prop_name, uint_t flags, dladm_status_t *status) 2286bcb5c89dSSowmini Varadhan { 2287bcb5c89dSSowmini Varadhan link_attr_t *p; 2288bcb5c89dSSowmini Varadhan 2289bcb5c89dSSowmini Varadhan p = dladm_name2prop(prop_name); 2290bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2291bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, prop_name, p->pp_id, 2292bcb5c89dSSowmini Varadhan flags, status)); 2293bcb5c89dSSowmini Varadhan } 2294bcb5c89dSSowmini Varadhan 2295bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2296bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid, 2297bcb5c89dSSowmini Varadhan mac_prop_id_t propid, uint_t flags, dladm_status_t *status) 2298bcb5c89dSSowmini Varadhan { 2299bcb5c89dSSowmini Varadhan link_attr_t *p; 2300bcb5c89dSSowmini Varadhan 2301bcb5c89dSSowmini Varadhan p = dladm_id2prop(propid); 2302bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2303bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, p->pp_name, propid, 2304bcb5c89dSSowmini Varadhan flags, status)); 2305bcb5c89dSSowmini Varadhan } 2306bcb5c89dSSowmini Varadhan 2307e7801d59Ssowmini /* ARGSUSED */ 2308e7801d59Ssowmini static dladm_status_t 23094ac67f02SAnurag S. Maskey i_dladm_set_public_prop(dladm_handle_t handle, prop_desc_t *pdp, 23104ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 23114ac67f02SAnurag S. Maskey datalink_media_t media) 2312e7801d59Ssowmini { 23133fd94f8cSam223141 dld_ioc_macprop_t *dip; 2314e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2315e7801d59Ssowmini uint8_t u8; 2316e7801d59Ssowmini uint16_t u16; 2317e7801d59Ssowmini uint32_t u32; 2318e7801d59Ssowmini void *val; 2319e7801d59Ssowmini 2320da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 0, &status); 2321e7801d59Ssowmini if (dip == NULL) 2322e7801d59Ssowmini return (status); 2323e7801d59Ssowmini 2324da14cebeSEric Cheng if (pdp->pd_flags & PD_CHECK_ALLOC) 2325e7801d59Ssowmini val = (void *)vdp->vd_val; 2326e7801d59Ssowmini else { 2327e7801d59Ssowmini /* 2328e7801d59Ssowmini * Currently all 1/2/4-byte size properties are byte/word/int. 2329e7801d59Ssowmini * No need (yet) to distinguish these from arrays of same size. 2330e7801d59Ssowmini */ 2331e7801d59Ssowmini switch (dip->pr_valsize) { 2332e7801d59Ssowmini case 1: 2333e7801d59Ssowmini u8 = vdp->vd_val; 2334e7801d59Ssowmini val = &u8; 2335e7801d59Ssowmini break; 2336e7801d59Ssowmini case 2: 2337e7801d59Ssowmini u16 = vdp->vd_val; 2338e7801d59Ssowmini val = &u16; 2339e7801d59Ssowmini break; 2340e7801d59Ssowmini case 4: 2341e7801d59Ssowmini u32 = vdp->vd_val; 2342e7801d59Ssowmini val = &u32; 2343e7801d59Ssowmini break; 2344e7801d59Ssowmini default: 2345e7801d59Ssowmini val = &vdp->vd_val; 2346e7801d59Ssowmini break; 2347e7801d59Ssowmini } 2348e7801d59Ssowmini } 2349e7801d59Ssowmini 23503bc21d0aSAruna Ramakrishna - Sun Microsystems if (val != NULL) 2351e7801d59Ssowmini (void) memcpy(dip->pr_val, val, dip->pr_valsize); 23523bc21d0aSAruna Ramakrishna - Sun Microsystems else 23533bc21d0aSAruna Ramakrishna - Sun Microsystems dip->pr_valsize = 0; 23543bc21d0aSAruna Ramakrishna - Sun Microsystems 23554ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 2356bcb5c89dSSowmini Varadhan 2357bcb5c89dSSowmini Varadhan done: 2358bcb5c89dSSowmini Varadhan free(dip); 2359bcb5c89dSSowmini Varadhan return (status); 2360bcb5c89dSSowmini Varadhan } 2361bcb5c89dSSowmini Varadhan 2362bcb5c89dSSowmini Varadhan dladm_status_t 23634ac67f02SAnurag S. Maskey i_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set) 2364bcb5c89dSSowmini Varadhan { 2365bcb5c89dSSowmini Varadhan dladm_status_t status = DLADM_STATUS_OK; 2366bcb5c89dSSowmini Varadhan 23674ac67f02SAnurag S. Maskey if (ioctl(dladm_dld_fd(handle), 23684ac67f02SAnurag S. Maskey (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) 2369e7801d59Ssowmini status = dladm_errno2status(errno); 2370e7801d59Ssowmini 2371e7801d59Ssowmini return (status); 2372e7801d59Ssowmini } 2373e7801d59Ssowmini 23743fd94f8cSam223141 static dld_ioc_macprop_t * 23754ac67f02SAnurag S. Maskey i_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid, 23764ac67f02SAnurag S. Maskey char *prop_name, uint_t flags, dladm_status_t *status, uint_t *perm_flags) 2377e7801d59Ssowmini { 23783fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 23794045d941Ssowmini 2380bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(0, linkid, prop_name, flags, status); 23814045d941Ssowmini if (dip == NULL) 23824045d941Ssowmini return (NULL); 2383e7801d59Ssowmini 23844ac67f02SAnurag S. Maskey *status = i_dladm_macprop(handle, dip, B_FALSE); 23854045d941Ssowmini if (*status != DLADM_STATUS_OK) { 23864045d941Ssowmini free(dip); 23874045d941Ssowmini return (NULL); 23884045d941Ssowmini } 2389da14cebeSEric Cheng if (perm_flags != NULL) 2390da14cebeSEric Cheng *perm_flags = dip->pr_perm_flags; 2391da14cebeSEric Cheng 23924045d941Ssowmini return (dip); 2393e7801d59Ssowmini } 2394e7801d59Ssowmini 2395e7801d59Ssowmini /* ARGSUSED */ 2396e7801d59Ssowmini static dladm_status_t 23974ac67f02SAnurag S. Maskey i_dladm_defmtu_check(dladm_handle_t handle, prop_desc_t *pdp, 23984ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *v, 23994ac67f02SAnurag S. Maskey datalink_media_t media) 2400e7801d59Ssowmini { 2401e7801d59Ssowmini if (val_cnt != 1) 2402e7801d59Ssowmini return (DLADM_STATUS_BADVAL); 24034045d941Ssowmini v->vd_val = atoi(prop_val[0]); 2404e7801d59Ssowmini return (DLADM_STATUS_OK); 2405e7801d59Ssowmini } 2406e7801d59Ssowmini 2407e7801d59Ssowmini /* ARGSUSED */ 2408e7801d59Ssowmini static dladm_status_t 24094ac67f02SAnurag S. Maskey i_dladm_duplex_get(dladm_handle_t handle, prop_desc_t *pdp, 24104ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 24114ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2412e7801d59Ssowmini { 2413e7801d59Ssowmini link_duplex_t link_duplex; 2414e7801d59Ssowmini dladm_status_t status; 2415e7801d59Ssowmini 24164ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", 2417e7801d59Ssowmini KSTAT_DATA_UINT32, &link_duplex)) != 0) 2418e7801d59Ssowmini return (status); 2419e7801d59Ssowmini 2420e7801d59Ssowmini switch (link_duplex) { 2421e7801d59Ssowmini case LINK_DUPLEX_FULL: 2422e7801d59Ssowmini (void) strcpy(*prop_val, "full"); 2423e7801d59Ssowmini break; 2424e7801d59Ssowmini case LINK_DUPLEX_HALF: 2425e7801d59Ssowmini (void) strcpy(*prop_val, "half"); 2426e7801d59Ssowmini break; 2427e7801d59Ssowmini default: 2428e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2429e7801d59Ssowmini break; 2430e7801d59Ssowmini } 2431e7801d59Ssowmini *val_cnt = 1; 2432e7801d59Ssowmini return (DLADM_STATUS_OK); 2433e7801d59Ssowmini } 2434e7801d59Ssowmini 2435e7801d59Ssowmini /* ARGSUSED */ 2436e7801d59Ssowmini static dladm_status_t 24374ac67f02SAnurag S. Maskey i_dladm_speed_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2438da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, uint_t flags, uint_t *perm_flags) 2439e7801d59Ssowmini { 2440e7801d59Ssowmini uint64_t ifspeed = 0; 2441e7801d59Ssowmini dladm_status_t status; 2442e7801d59Ssowmini 24434ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", 2444e7801d59Ssowmini KSTAT_DATA_UINT64, &ifspeed)) != 0) 2445e7801d59Ssowmini return (status); 24464045d941Ssowmini 24476b9e797cSsowmini if ((ifspeed % 1000000) != 0) { 24486b9e797cSsowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 24496b9e797cSsowmini "%llf", ifspeed / (float)1000000); /* Mbps */ 24506b9e797cSsowmini } else { 2451e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 2452e7801d59Ssowmini "%llu", ifspeed / 1000000); /* Mbps */ 24536b9e797cSsowmini } 2454e7801d59Ssowmini *val_cnt = 1; 2455da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2456e7801d59Ssowmini return (DLADM_STATUS_OK); 2457e7801d59Ssowmini } 2458e7801d59Ssowmini 2459e7801d59Ssowmini /* ARGSUSED */ 2460e7801d59Ssowmini static dladm_status_t 24614ac67f02SAnurag S. Maskey i_dladm_status_get(dladm_handle_t handle, prop_desc_t *pdp, 24624ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 24634ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2464e7801d59Ssowmini { 2465e7801d59Ssowmini link_state_t link_state; 2466e7801d59Ssowmini dladm_status_t status; 2467e7801d59Ssowmini 24684ac67f02SAnurag S. Maskey status = i_dladm_get_state(handle, linkid, &link_state); 24694045d941Ssowmini if (status != DLADM_STATUS_OK) 2470e7801d59Ssowmini return (status); 2471da14cebeSEric Cheng 2472e7801d59Ssowmini switch (link_state) { 2473e7801d59Ssowmini case LINK_STATE_UP: 2474e7801d59Ssowmini (void) strcpy(*prop_val, "up"); 2475e7801d59Ssowmini break; 2476e7801d59Ssowmini case LINK_STATE_DOWN: 2477e7801d59Ssowmini (void) strcpy(*prop_val, "down"); 2478e7801d59Ssowmini break; 2479e7801d59Ssowmini default: 2480e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2481e7801d59Ssowmini break; 2482e7801d59Ssowmini } 2483e7801d59Ssowmini *val_cnt = 1; 24844784fcbdSSowmini Varadhan *perm_flags = MAC_PROP_PERM_READ; 2485e7801d59Ssowmini return (DLADM_STATUS_OK); 2486e7801d59Ssowmini } 2487e7801d59Ssowmini 2488e7801d59Ssowmini /* ARGSUSED */ 2489e7801d59Ssowmini static dladm_status_t 24904ac67f02SAnurag S. Maskey i_dladm_binary_get(dladm_handle_t handle, prop_desc_t *pdp, 24914ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 24924ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2493e7801d59Ssowmini { 24943fd94f8cSam223141 dld_ioc_macprop_t *dip; 2495e7801d59Ssowmini dladm_status_t status; 2496e7801d59Ssowmini 24974ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2498da14cebeSEric Cheng &status, perm_flags); 24994045d941Ssowmini if (dip == NULL) 2500e7801d59Ssowmini return (status); 2501da14cebeSEric Cheng 2502e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%x", dip->pr_val[0]); 2503e7801d59Ssowmini free(dip); 2504e7801d59Ssowmini *val_cnt = 1; 2505e7801d59Ssowmini return (DLADM_STATUS_OK); 2506e7801d59Ssowmini } 2507e7801d59Ssowmini 25086b9e797cSsowmini /* ARGSUSED */ 2509e7801d59Ssowmini static dladm_status_t 25104ac67f02SAnurag S. Maskey i_dladm_uint32_get(dladm_handle_t handle, prop_desc_t *pdp, 25114ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 25124ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2513e7801d59Ssowmini { 25143fd94f8cSam223141 dld_ioc_macprop_t *dip; 25154045d941Ssowmini uint32_t v = 0; 2516e7801d59Ssowmini uchar_t *cp; 2517e7801d59Ssowmini dladm_status_t status; 2518e7801d59Ssowmini 25194ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2520da14cebeSEric Cheng &status, perm_flags); 25214045d941Ssowmini if (dip == NULL) 2522e7801d59Ssowmini return (status); 2523da14cebeSEric Cheng 2524e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2525e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 25264045d941Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", v); 2527e7801d59Ssowmini free(dip); 2528e7801d59Ssowmini *val_cnt = 1; 2529e7801d59Ssowmini return (DLADM_STATUS_OK); 2530e7801d59Ssowmini } 2531e7801d59Ssowmini 2532f0f2c3a5SGirish Moodalbail /* 2533f0f2c3a5SGirish Moodalbail * Determines the size of the structure that needs to be sent to drivers 2534f0f2c3a5SGirish Moodalbail * for retrieving the property range values. 2535f0f2c3a5SGirish Moodalbail */ 2536f0f2c3a5SGirish Moodalbail static int 2537f0f2c3a5SGirish Moodalbail i_dladm_range_size(mac_propval_range_t *r, size_t *sz) 2538f0f2c3a5SGirish Moodalbail { 2539f0f2c3a5SGirish Moodalbail uint_t count = r->mpr_count; 2540f0f2c3a5SGirish Moodalbail 2541f0f2c3a5SGirish Moodalbail *sz = sizeof (mac_propval_range_t); 2542f0f2c3a5SGirish Moodalbail --count; 2543f0f2c3a5SGirish Moodalbail 2544f0f2c3a5SGirish Moodalbail switch (r->mpr_type) { 2545f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: 2546f0f2c3a5SGirish Moodalbail *sz += (count * sizeof (mac_propval_uint32_range_t)); 2547f0f2c3a5SGirish Moodalbail return (0); 2548f0f2c3a5SGirish Moodalbail default: 2549f0f2c3a5SGirish Moodalbail break; 2550f0f2c3a5SGirish Moodalbail } 2551f0f2c3a5SGirish Moodalbail *sz = 0; 2552f0f2c3a5SGirish Moodalbail return (EINVAL); 2553f0f2c3a5SGirish Moodalbail } 2554f0f2c3a5SGirish Moodalbail 2555f0f2c3a5SGirish Moodalbail /* ARGSUSED */ 2556f0f2c3a5SGirish Moodalbail static dladm_status_t 2557f0f2c3a5SGirish Moodalbail i_dladm_range_get(dladm_handle_t handle, prop_desc_t *pdp, 2558f0f2c3a5SGirish Moodalbail datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2559f0f2c3a5SGirish Moodalbail datalink_media_t media, uint_t flags, uint_t *perm_flags) 2560f0f2c3a5SGirish Moodalbail { 2561f0f2c3a5SGirish Moodalbail dld_ioc_macprop_t *dip; 2562f0f2c3a5SGirish Moodalbail dladm_status_t status = DLADM_STATUS_OK; 2563f0f2c3a5SGirish Moodalbail size_t sz; 2564f0f2c3a5SGirish Moodalbail mac_propval_range_t *rangep; 2565f0f2c3a5SGirish Moodalbail 2566f0f2c3a5SGirish Moodalbail sz = sizeof (mac_propval_range_t); 2567f0f2c3a5SGirish Moodalbail 2568f0f2c3a5SGirish Moodalbail /* 2569f0f2c3a5SGirish Moodalbail * As caller we don't know number of value ranges, the driver 2570f0f2c3a5SGirish Moodalbail * supports. To begin with we assume that number to be 1. If the 2571f0f2c3a5SGirish Moodalbail * buffer size is insufficient, driver returns back with the 2572f0f2c3a5SGirish Moodalbail * actual count of value ranges. See mac.h for more details. 2573f0f2c3a5SGirish Moodalbail */ 2574f0f2c3a5SGirish Moodalbail retry: 2575f0f2c3a5SGirish Moodalbail if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags, 2576f0f2c3a5SGirish Moodalbail &status)) == NULL) 2577f0f2c3a5SGirish Moodalbail return (status); 2578f0f2c3a5SGirish Moodalbail 2579f0f2c3a5SGirish Moodalbail status = i_dladm_macprop(handle, dip, B_FALSE); 2580f0f2c3a5SGirish Moodalbail if (status != DLADM_STATUS_OK) { 2581f0f2c3a5SGirish Moodalbail if (status == DLADM_STATUS_TOOSMALL) { 2582f0f2c3a5SGirish Moodalbail int err; 2583f0f2c3a5SGirish Moodalbail 2584f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2585f0f2c3a5SGirish Moodalbail if ((err = i_dladm_range_size(rangep, &sz)) == 0) { 2586f0f2c3a5SGirish Moodalbail free(dip); 2587f0f2c3a5SGirish Moodalbail goto retry; 2588f0f2c3a5SGirish Moodalbail } else { 2589f0f2c3a5SGirish Moodalbail status = dladm_errno2status(err); 2590f0f2c3a5SGirish Moodalbail } 2591f0f2c3a5SGirish Moodalbail } 2592f0f2c3a5SGirish Moodalbail free(dip); 2593f0f2c3a5SGirish Moodalbail return (status); 2594f0f2c3a5SGirish Moodalbail } 2595f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2596f0f2c3a5SGirish Moodalbail 2597f0f2c3a5SGirish Moodalbail switch (rangep->mpr_type) { 2598f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: { 2599f0f2c3a5SGirish Moodalbail mac_propval_uint32_range_t *ur; 2600f0f2c3a5SGirish Moodalbail uint_t count = rangep->mpr_count, i; 2601f0f2c3a5SGirish Moodalbail 2602f0f2c3a5SGirish Moodalbail ur = &rangep->range_uint32[0]; 2603f0f2c3a5SGirish Moodalbail 2604f0f2c3a5SGirish Moodalbail for (i = 0; i < count; i++, ur++) { 2605f0f2c3a5SGirish Moodalbail if (ur->mpur_min == ur->mpur_max) { 2606f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2607f0f2c3a5SGirish Moodalbail "%ld", ur->mpur_min); 2608f0f2c3a5SGirish Moodalbail } else { 2609f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2610f0f2c3a5SGirish Moodalbail "%ld-%ld", ur->mpur_min, ur->mpur_max); 2611f0f2c3a5SGirish Moodalbail } 2612f0f2c3a5SGirish Moodalbail } 2613f0f2c3a5SGirish Moodalbail *val_cnt = count; 2614f0f2c3a5SGirish Moodalbail break; 2615f0f2c3a5SGirish Moodalbail } 2616f0f2c3a5SGirish Moodalbail default: 2617f0f2c3a5SGirish Moodalbail status = DLADM_STATUS_BADARG; 2618f0f2c3a5SGirish Moodalbail break; 2619f0f2c3a5SGirish Moodalbail } 2620f0f2c3a5SGirish Moodalbail free(dip); 2621f0f2c3a5SGirish Moodalbail return (status); 2622f0f2c3a5SGirish Moodalbail } 2623f0f2c3a5SGirish Moodalbail 26246b9e797cSsowmini /* ARGSUSED */ 2625e7801d59Ssowmini static dladm_status_t 2626e75f0919SSebastien Roy i_dladm_tagmode_get(dladm_handle_t handle, prop_desc_t *pdp, 2627e75f0919SSebastien Roy datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2628e75f0919SSebastien Roy datalink_media_t media, uint_t flags, uint_t *perm_flags) 2629e75f0919SSebastien Roy { 2630e75f0919SSebastien Roy dld_ioc_macprop_t *dip; 2631e75f0919SSebastien Roy link_tagmode_t mode; 2632e75f0919SSebastien Roy dladm_status_t status; 2633e75f0919SSebastien Roy 2634e75f0919SSebastien Roy dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2635e75f0919SSebastien Roy &status, perm_flags); 2636e75f0919SSebastien Roy if (dip == NULL) 2637e75f0919SSebastien Roy return (status); 2638e75f0919SSebastien Roy (void) memcpy(&mode, dip->pr_val, sizeof (mode)); 2639e75f0919SSebastien Roy free(dip); 2640e75f0919SSebastien Roy 2641e75f0919SSebastien Roy switch (mode) { 2642e75f0919SSebastien Roy case LINK_TAGMODE_NORMAL: 2643e75f0919SSebastien Roy (void) strlcpy(*prop_val, "normal", DLADM_PROP_VAL_MAX); 2644e75f0919SSebastien Roy break; 2645e75f0919SSebastien Roy case LINK_TAGMODE_VLANONLY: 2646e75f0919SSebastien Roy (void) strlcpy(*prop_val, "vlanonly", DLADM_PROP_VAL_MAX); 2647e75f0919SSebastien Roy break; 2648e75f0919SSebastien Roy default: 2649e75f0919SSebastien Roy (void) strlcpy(*prop_val, "unknown", DLADM_PROP_VAL_MAX); 2650e75f0919SSebastien Roy } 2651e75f0919SSebastien Roy *val_cnt = 1; 2652e75f0919SSebastien Roy return (DLADM_STATUS_OK); 2653e75f0919SSebastien Roy } 2654e75f0919SSebastien Roy 2655e75f0919SSebastien Roy /* ARGSUSED */ 2656e75f0919SSebastien Roy static dladm_status_t 26574ac67f02SAnurag S. Maskey i_dladm_flowctl_get(dladm_handle_t handle, prop_desc_t *pdp, 26584ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 26594ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2660e7801d59Ssowmini { 26613fd94f8cSam223141 dld_ioc_macprop_t *dip; 2662e7801d59Ssowmini link_flowctrl_t v; 2663e7801d59Ssowmini dladm_status_t status; 2664e7801d59Ssowmini uchar_t *cp; 2665e7801d59Ssowmini 26664ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2667da14cebeSEric Cheng &status, perm_flags); 26684045d941Ssowmini if (dip == NULL) 2669e7801d59Ssowmini return (status); 2670da14cebeSEric Cheng 2671e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2672e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 2673e7801d59Ssowmini switch (v) { 2674e7801d59Ssowmini case LINK_FLOWCTRL_NONE: 2675e7801d59Ssowmini (void) sprintf(*prop_val, "no"); 2676e7801d59Ssowmini break; 2677e7801d59Ssowmini case LINK_FLOWCTRL_RX: 2678e7801d59Ssowmini (void) sprintf(*prop_val, "rx"); 2679e7801d59Ssowmini break; 2680e7801d59Ssowmini case LINK_FLOWCTRL_TX: 2681e7801d59Ssowmini (void) sprintf(*prop_val, "tx"); 2682e7801d59Ssowmini break; 2683e7801d59Ssowmini case LINK_FLOWCTRL_BI: 2684e7801d59Ssowmini (void) sprintf(*prop_val, "bi"); 2685e7801d59Ssowmini break; 2686e7801d59Ssowmini } 2687e7801d59Ssowmini free(dip); 2688e7801d59Ssowmini *val_cnt = 1; 2689e7801d59Ssowmini return (DLADM_STATUS_OK); 2690e7801d59Ssowmini } 2691e7801d59Ssowmini 2692e7801d59Ssowmini 2693e7801d59Ssowmini /* ARGSUSED */ 2694e7801d59Ssowmini static dladm_status_t 2695*3361618bSRishi Srivatsavai i_dladm_set_private_prop(dladm_handle_t handle, datalink_id_t linkid, 26964ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 26974ac67f02SAnurag S. Maskey 2698e7801d59Ssowmini { 2699bcb5c89dSSowmini Varadhan int i, slen; 2700eae72b5bSSebastien Roy int bufsize = 0; 27013fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 2702e7801d59Ssowmini uchar_t *dp; 2703bcb5c89dSSowmini Varadhan link_attr_t *p; 27044045d941Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2705e7801d59Ssowmini 2706e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 2707e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 2708e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2709e7801d59Ssowmini p = dladm_name2prop(prop_name); 27103fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 2711e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2712e7801d59Ssowmini 2713*3361618bSRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE)) 2714*3361618bSRishi Srivatsavai return (DLADM_STATUS_OK); 2715*3361618bSRishi Srivatsavai 2716e7801d59Ssowmini /* 2717e7801d59Ssowmini * private properties: all parsing is done in the kernel. 2718e7801d59Ssowmini * allocate a enough space for each property + its separator (','). 2719e7801d59Ssowmini */ 2720e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2721e7801d59Ssowmini bufsize += strlen(prop_val[i]) + 1; 2722e7801d59Ssowmini } 27234045d941Ssowmini 27244045d941Ssowmini if (prop_val == NULL) { 27254045d941Ssowmini /* 27264045d941Ssowmini * getting default value. so use more buffer space. 27274045d941Ssowmini */ 2728bcb5c89dSSowmini Varadhan bufsize += DLADM_PROP_BUF_CHUNK; 27294045d941Ssowmini } 27304045d941Ssowmini 2731bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(bufsize + 1, linkid, prop_name, 27323fd94f8cSam223141 (prop_val != NULL ? 0 : MAC_PROP_DEFAULT), &status); 2733e7801d59Ssowmini if (dip == NULL) 2734e7801d59Ssowmini return (status); 2735e7801d59Ssowmini 2736e7801d59Ssowmini dp = (uchar_t *)dip->pr_val; 2737e7801d59Ssowmini slen = 0; 2738bcb5c89dSSowmini Varadhan 27394045d941Ssowmini if (prop_val == NULL) { 27404ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_FALSE); 274162ee1d25SArtem Kachitchkine dip->pr_flags = 0; 27424045d941Ssowmini } else { 2743e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2744e7801d59Ssowmini int plen = 0; 2745e7801d59Ssowmini 2746e7801d59Ssowmini plen = strlen(prop_val[i]); 2747e7801d59Ssowmini bcopy(prop_val[i], dp, plen); 2748e7801d59Ssowmini slen += plen; 2749e7801d59Ssowmini /* 2750e7801d59Ssowmini * add a "," separator and update dp. 2751e7801d59Ssowmini */ 2752e7801d59Ssowmini if (i != (val_cnt -1)) 2753e7801d59Ssowmini dp[slen++] = ','; 2754e7801d59Ssowmini dp += (plen + 1); 2755e7801d59Ssowmini } 2756e7801d59Ssowmini } 275762ee1d25SArtem Kachitchkine if (status == DLADM_STATUS_OK) 275862ee1d25SArtem Kachitchkine status = i_dladm_macprop(handle, dip, B_TRUE); 27594045d941Ssowmini 2760e7801d59Ssowmini free(dip); 2761e7801d59Ssowmini return (status); 2762e7801d59Ssowmini } 2763e7801d59Ssowmini 2764e7801d59Ssowmini static dladm_status_t 276562ee1d25SArtem Kachitchkine i_dladm_get_priv_prop(dladm_handle_t handle, datalink_id_t linkid, 27664ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cnt, 27674ac67f02SAnurag S. Maskey dladm_prop_type_t type, uint_t dld_flags) 2768e7801d59Ssowmini { 2769e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 27703fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 2771bcb5c89dSSowmini Varadhan link_attr_t *p; 2772e7801d59Ssowmini 2773e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 2774e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 2775e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2776e7801d59Ssowmini 2777e7801d59Ssowmini p = dladm_name2prop(prop_name); 27783fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 2779e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2780e7801d59Ssowmini 2781e7801d59Ssowmini /* 2782e7801d59Ssowmini * private properties: all parsing is done in the kernel. 2783e7801d59Ssowmini */ 2784bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(DLADM_PROP_BUF_CHUNK, linkid, prop_name, 2785bcb5c89dSSowmini Varadhan dld_flags, &status); 2786e7801d59Ssowmini if (dip == NULL) 2787e7801d59Ssowmini return (status); 2788e7801d59Ssowmini 27894ac67f02SAnurag S. Maskey if ((status = i_dladm_macprop(handle, dip, B_FALSE)) == 27904ac67f02SAnurag S. Maskey DLADM_STATUS_OK) { 2791afdda45fSVasumathi Sundaram - Sun Microsystems if (type == DLADM_PROP_VAL_PERM) { 2792da14cebeSEric Cheng (void) dladm_perm2str(dip->pr_perm_flags, *prop_val); 279362ee1d25SArtem Kachitchkine } else if (type == DLADM_PROP_VAL_MODIFIABLE) { 279462ee1d25SArtem Kachitchkine *prop_val[0] = '\0'; 2795afdda45fSVasumathi Sundaram - Sun Microsystems } else { 2796afdda45fSVasumathi Sundaram - Sun Microsystems (void) strncpy(*prop_val, dip->pr_val, 2797afdda45fSVasumathi Sundaram - Sun Microsystems DLADM_PROP_VAL_MAX); 2798afdda45fSVasumathi Sundaram - Sun Microsystems } 2799e7801d59Ssowmini *val_cnt = 1; 280062ee1d25SArtem Kachitchkine } else if ((status == DLADM_STATUS_NOTSUP) && 280162ee1d25SArtem Kachitchkine (type == DLADM_PROP_VAL_CURRENT)) { 280262ee1d25SArtem Kachitchkine status = DLADM_STATUS_NOTFOUND; 2803e7801d59Ssowmini } 28044045d941Ssowmini free(dip); 28054045d941Ssowmini return (status); 28064045d941Ssowmini } 28074045d941Ssowmini 28084045d941Ssowmini 28094045d941Ssowmini static dladm_status_t 28104ac67f02SAnurag S. Maskey i_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp, 28114ac67f02SAnurag S. Maskey datalink_id_t linkid, datalink_media_t media, uint_t flags) 28124045d941Ssowmini { 28134045d941Ssowmini dladm_status_t status; 28144045d941Ssowmini char **prop_vals = NULL, *buf; 28154045d941Ssowmini size_t bufsize; 28164045d941Ssowmini uint_t cnt; 28174045d941Ssowmini int i; 2818afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 28194045d941Ssowmini 28204045d941Ssowmini /* 28214045d941Ssowmini * Allocate buffer needed for prop_vals array. We can have at most 28224045d941Ssowmini * DLADM_MAX_PROP_VALCNT char *prop_vals[] entries, where 28234045d941Ssowmini * each entry has max size DLADM_PROP_VAL_MAX 28244045d941Ssowmini */ 28254045d941Ssowmini bufsize = 28264045d941Ssowmini (sizeof (char *) + DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT; 28274045d941Ssowmini buf = malloc(bufsize); 28284045d941Ssowmini prop_vals = (char **)(void *)buf; 28294045d941Ssowmini for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) { 28304045d941Ssowmini prop_vals[i] = buf + 28314045d941Ssowmini sizeof (char *) * DLADM_MAX_PROP_VALCNT + 28324045d941Ssowmini i * DLADM_PROP_VAL_MAX; 28334045d941Ssowmini } 283413a55820Sar224390 283513a55820Sar224390 /* 28363bc21d0aSAruna Ramakrishna - Sun Microsystems * For properties which have pdp->pd_defval.vd_name as a non-empty 28373bc21d0aSAruna Ramakrishna - Sun Microsystems * string, the "" itself is used to reset the property (exceptions 28383bc21d0aSAruna Ramakrishna - Sun Microsystems * are zone and autopush, which populate vdp->vd_val). So 28393bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm can copy pdp->pd_defval over to the val_desc_t passed 28403bc21d0aSAruna Ramakrishna - Sun Microsystems * down on the setprop using the global values in the table. For 28413bc21d0aSAruna Ramakrishna - Sun Microsystems * other cases (vd_name is ""), doing reset-linkprop will cause 28423bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm to do a getprop to find the default value and then do 28433bc21d0aSAruna Ramakrishna - Sun Microsystems * a setprop to reset the value to default. 284413a55820Sar224390 */ 28454ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media, 2846afdda45fSVasumathi Sundaram - Sun Microsystems MAC_PROP_DEFAULT, &perm_flags); 28474045d941Ssowmini if (status == DLADM_STATUS_OK) { 2848afdda45fSVasumathi Sundaram - Sun Microsystems if (perm_flags == MAC_PROP_PERM_RW) { 28494ac67f02SAnurag S. Maskey status = i_dladm_set_single_prop(handle, linkid, 28504ac67f02SAnurag S. Maskey pdp->pd_class, media, pdp, prop_vals, cnt, flags); 28514045d941Ssowmini } 2852afdda45fSVasumathi Sundaram - Sun Microsystems else 2853afdda45fSVasumathi Sundaram - Sun Microsystems status = DLADM_STATUS_NOTSUP; 2854afdda45fSVasumathi Sundaram - Sun Microsystems } 28554045d941Ssowmini free(buf); 2856e7801d59Ssowmini return (status); 2857e7801d59Ssowmini } 2858bcb5c89dSSowmini Varadhan 2859bcb5c89dSSowmini Varadhan int 2860bcb5c89dSSowmini Varadhan macprop_to_wifi(mac_prop_id_t wl_prop) 2861bcb5c89dSSowmini Varadhan { 2862bcb5c89dSSowmini Varadhan switch (wl_prop) { 2863bcb5c89dSSowmini Varadhan case MAC_PROP_WL_ESSID: 2864bcb5c89dSSowmini Varadhan return (WL_ESSID); 2865bcb5c89dSSowmini Varadhan case MAC_PROP_WL_BSSID: 2866bcb5c89dSSowmini Varadhan return (WL_BSSID); 2867bcb5c89dSSowmini Varadhan case MAC_PROP_WL_BSSTYPE: 2868bcb5c89dSSowmini Varadhan return (WL_BSS_TYPE); 2869bcb5c89dSSowmini Varadhan case MAC_PROP_WL_LINKSTATUS: 2870bcb5c89dSSowmini Varadhan return (WL_LINKSTATUS); 2871bcb5c89dSSowmini Varadhan case MAC_PROP_WL_DESIRED_RATES: 2872bcb5c89dSSowmini Varadhan return (WL_DESIRED_RATES); 2873bcb5c89dSSowmini Varadhan case MAC_PROP_WL_SUPPORTED_RATES: 2874bcb5c89dSSowmini Varadhan return (WL_SUPPORTED_RATES); 2875bcb5c89dSSowmini Varadhan case MAC_PROP_WL_AUTH_MODE: 2876bcb5c89dSSowmini Varadhan return (WL_AUTH_MODE); 2877bcb5c89dSSowmini Varadhan case MAC_PROP_WL_ENCRYPTION: 2878bcb5c89dSSowmini Varadhan return (WL_ENCRYPTION); 2879bcb5c89dSSowmini Varadhan case MAC_PROP_WL_RSSI: 2880bcb5c89dSSowmini Varadhan return (WL_RSSI); 2881bcb5c89dSSowmini Varadhan case MAC_PROP_WL_PHY_CONFIG: 2882bcb5c89dSSowmini Varadhan return (WL_PHY_CONFIG); 2883bcb5c89dSSowmini Varadhan case MAC_PROP_WL_CAPABILITY: 2884bcb5c89dSSowmini Varadhan return (WL_CAPABILITY); 2885bcb5c89dSSowmini Varadhan case MAC_PROP_WL_WPA: 2886bcb5c89dSSowmini Varadhan return (WL_WPA); 2887bcb5c89dSSowmini Varadhan case MAC_PROP_WL_SCANRESULTS: 2888bcb5c89dSSowmini Varadhan return (WL_SCANRESULTS); 2889bcb5c89dSSowmini Varadhan case MAC_PROP_WL_POWER_MODE: 2890bcb5c89dSSowmini Varadhan return (WL_POWER_MODE); 2891bcb5c89dSSowmini Varadhan case MAC_PROP_WL_RADIO: 2892bcb5c89dSSowmini Varadhan return (WL_RADIO); 2893bcb5c89dSSowmini Varadhan case MAC_PROP_WL_ESS_LIST: 2894bcb5c89dSSowmini Varadhan return (WL_ESS_LIST); 2895bcb5c89dSSowmini Varadhan case MAC_PROP_WL_KEY_TAB: 2896bcb5c89dSSowmini Varadhan return (WL_WEP_KEY_TAB); 2897bcb5c89dSSowmini Varadhan case MAC_PROP_WL_CREATE_IBSS: 2898bcb5c89dSSowmini Varadhan return (WL_CREATE_IBSS); 2899bcb5c89dSSowmini Varadhan case MAC_PROP_WL_SETOPTIE: 2900bcb5c89dSSowmini Varadhan return (WL_SETOPTIE); 2901bcb5c89dSSowmini Varadhan case MAC_PROP_WL_DELKEY: 2902bcb5c89dSSowmini Varadhan return (WL_DELKEY); 2903bcb5c89dSSowmini Varadhan case MAC_PROP_WL_KEY: 2904bcb5c89dSSowmini Varadhan return (WL_KEY); 2905bcb5c89dSSowmini Varadhan case MAC_PROP_WL_MLME: 2906bcb5c89dSSowmini Varadhan return (WL_MLME); 2907bcb5c89dSSowmini Varadhan default: 2908bcb5c89dSSowmini Varadhan return (-1); 2909bcb5c89dSSowmini Varadhan } 2910bcb5c89dSSowmini Varadhan } 2911bcb5c89dSSowmini Varadhan 2912bcb5c89dSSowmini Varadhan dladm_status_t 29134ac67f02SAnurag S. Maskey i_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf, 29144ac67f02SAnurag S. Maskey mac_prop_id_t cmd, size_t len, boolean_t set) 2915bcb5c89dSSowmini Varadhan { 2916bcb5c89dSSowmini Varadhan uint32_t flags; 2917bcb5c89dSSowmini Varadhan dladm_status_t status; 2918bcb5c89dSSowmini Varadhan uint32_t media; 2919bcb5c89dSSowmini Varadhan dld_ioc_macprop_t *dip; 2920bcb5c89dSSowmini Varadhan void *dp; 2921bcb5c89dSSowmini Varadhan 29224ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, 29234ac67f02SAnurag S. Maskey &media, NULL, 0)) != DLADM_STATUS_OK) { 2924bcb5c89dSSowmini Varadhan return (status); 2925bcb5c89dSSowmini Varadhan } 2926bcb5c89dSSowmini Varadhan 2927bcb5c89dSSowmini Varadhan if (media != DL_WIFI) 2928bcb5c89dSSowmini Varadhan return (DLADM_STATUS_BADARG); 2929bcb5c89dSSowmini Varadhan 2930bcb5c89dSSowmini Varadhan if (!(flags & DLADM_OPT_ACTIVE)) 2931bcb5c89dSSowmini Varadhan return (DLADM_STATUS_TEMPONLY); 2932bcb5c89dSSowmini Varadhan 2933bcb5c89dSSowmini Varadhan if (len == (MAX_BUF_LEN - WIFI_BUF_OFFSET)) 2934bcb5c89dSSowmini Varadhan len = MAX_BUF_LEN - sizeof (dld_ioc_macprop_t) - 1; 2935bcb5c89dSSowmini Varadhan 2936bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_id(len, linkid, cmd, 0, &status); 2937bcb5c89dSSowmini Varadhan if (dip == NULL) 2938bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 2939bcb5c89dSSowmini Varadhan 2940bcb5c89dSSowmini Varadhan dp = (uchar_t *)dip->pr_val; 2941bcb5c89dSSowmini Varadhan if (set) 2942bcb5c89dSSowmini Varadhan (void) memcpy(dp, buf, len); 2943bcb5c89dSSowmini Varadhan 29444ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, set); 2945bcb5c89dSSowmini Varadhan if (status == DLADM_STATUS_NOTSUP) { 2946bcb5c89dSSowmini Varadhan if (set) { 29474ac67f02SAnurag S. Maskey status = i_dladm_wlan_set_legacy_ioctl(handle, linkid, 2948bcb5c89dSSowmini Varadhan buf, len, macprop_to_wifi(cmd)); 2949bcb5c89dSSowmini Varadhan } else { 29504ac67f02SAnurag S. Maskey status = i_dladm_wlan_get_legacy_ioctl(handle, linkid, 2951bcb5c89dSSowmini Varadhan buf, len, macprop_to_wifi(cmd)); 2952bcb5c89dSSowmini Varadhan } 2953bcb5c89dSSowmini Varadhan } else if (status == DLADM_STATUS_OK) { 2954bcb5c89dSSowmini Varadhan if (!set) 2955bcb5c89dSSowmini Varadhan (void) memcpy(buf, dp, len); 2956bcb5c89dSSowmini Varadhan } 2957bcb5c89dSSowmini Varadhan 2958bcb5c89dSSowmini Varadhan free(dip); 2959bcb5c89dSSowmini Varadhan return (status); 2960bcb5c89dSSowmini Varadhan } 2961bcb5c89dSSowmini Varadhan 2962bcb5c89dSSowmini Varadhan static dladm_status_t 29634ac67f02SAnurag S. Maskey i_dladm_wlan_get_legacy_ioctl(dladm_handle_t handle, datalink_id_t linkid, 29644ac67f02SAnurag S. Maskey void *buf, uint_t buflen, uint_t id) 2965bcb5c89dSSowmini Varadhan { 2966bcb5c89dSSowmini Varadhan wldp_t *gbuf; 2967bcb5c89dSSowmini Varadhan dladm_status_t status; 2968bcb5c89dSSowmini Varadhan 2969bcb5c89dSSowmini Varadhan if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) 2970bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 2971bcb5c89dSSowmini Varadhan 2972bcb5c89dSSowmini Varadhan (void) memset(gbuf, 0, MAX_BUF_LEN); 29734ac67f02SAnurag S. Maskey status = i_dladm_wlan_legacy_ioctl(handle, linkid, gbuf, id, 29744ac67f02SAnurag S. Maskey MAX_BUF_LEN, WLAN_GET_PARAM, sizeof (wldp_t)); 2975bcb5c89dSSowmini Varadhan if (status == DLADM_STATUS_OK) 2976bcb5c89dSSowmini Varadhan (void) memcpy(buf, gbuf->wldp_buf, buflen); 2977bcb5c89dSSowmini Varadhan 2978bcb5c89dSSowmini Varadhan free(gbuf); 2979bcb5c89dSSowmini Varadhan return (status); 2980bcb5c89dSSowmini Varadhan } 2981bcb5c89dSSowmini Varadhan 2982bcb5c89dSSowmini Varadhan static dladm_status_t 29834ac67f02SAnurag S. Maskey i_dladm_wlan_set_legacy_ioctl(dladm_handle_t handle, datalink_id_t linkid, 29844ac67f02SAnurag S. Maskey void *buf, uint_t buflen, uint_t id) 2985bcb5c89dSSowmini Varadhan { 2986bcb5c89dSSowmini Varadhan wldp_t *gbuf; 2987bcb5c89dSSowmini Varadhan dladm_status_t status = DLADM_STATUS_OK; 2988bcb5c89dSSowmini Varadhan 2989bcb5c89dSSowmini Varadhan if ((gbuf = malloc(MAX_BUF_LEN)) == NULL) 2990bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 2991bcb5c89dSSowmini Varadhan 2992bcb5c89dSSowmini Varadhan (void) memset(gbuf, 0, MAX_BUF_LEN); 2993bcb5c89dSSowmini Varadhan (void) memcpy(gbuf->wldp_buf, buf, buflen); 2994bcb5c89dSSowmini Varadhan buflen += WIFI_BUF_OFFSET; 29954ac67f02SAnurag S. Maskey status = i_dladm_wlan_legacy_ioctl(handle, linkid, gbuf, id, buflen, 2996bcb5c89dSSowmini Varadhan WLAN_SET_PARAM, buflen); 2997bcb5c89dSSowmini Varadhan 2998bcb5c89dSSowmini Varadhan free(gbuf); 2999bcb5c89dSSowmini Varadhan return (status); 3000bcb5c89dSSowmini Varadhan } 3001da14cebeSEric Cheng 3002da14cebeSEric Cheng dladm_status_t 3003da14cebeSEric Cheng dladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues) 3004da14cebeSEric Cheng { 300562ee1d25SArtem Kachitchkine return (dladm_parse_args(str, listp, novalues)); 3006da14cebeSEric Cheng } 3007da14cebeSEric Cheng 3008da14cebeSEric Cheng /* 3009da14cebeSEric Cheng * Retrieve the one link property from the database 3010da14cebeSEric Cheng */ 3011da14cebeSEric Cheng /*ARGSUSED*/ 3012da14cebeSEric Cheng static int 30134ac67f02SAnurag S. Maskey i_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid, 30144ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 3015da14cebeSEric Cheng { 3016da14cebeSEric Cheng dladm_arg_list_t *proplist = arg; 3017da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3018da14cebeSEric Cheng 3019da14cebeSEric Cheng aip = &proplist->al_info[proplist->al_count]; 3020da14cebeSEric Cheng /* 3021da14cebeSEric Cheng * it is fine to point to prop_name since prop_name points to the 3022da14cebeSEric Cheng * prop_table[n].pd_name. 3023da14cebeSEric Cheng */ 3024da14cebeSEric Cheng aip->ai_name = prop_name; 3025da14cebeSEric Cheng 30264ac67f02SAnurag S. Maskey (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 30274ac67f02SAnurag S. Maskey prop_name, aip->ai_val, &aip->ai_count); 3028da14cebeSEric Cheng 3029da14cebeSEric Cheng if (aip->ai_count != 0) 3030da14cebeSEric Cheng proplist->al_count++; 3031da14cebeSEric Cheng 3032da14cebeSEric Cheng return (DLADM_WALK_CONTINUE); 3033da14cebeSEric Cheng } 3034da14cebeSEric Cheng 3035da14cebeSEric Cheng 3036da14cebeSEric Cheng /* 3037da14cebeSEric Cheng * Retrieve all link properties for a link from the database and 3038da14cebeSEric Cheng * return a property list. 3039da14cebeSEric Cheng */ 3040da14cebeSEric Cheng dladm_status_t 30414ac67f02SAnurag S. Maskey dladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid, 30424ac67f02SAnurag S. Maskey dladm_arg_list_t **listp) 3043da14cebeSEric Cheng { 3044da14cebeSEric Cheng dladm_arg_list_t *list; 3045da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3046da14cebeSEric Cheng 3047da14cebeSEric Cheng list = calloc(1, sizeof (dladm_arg_list_t)); 3048da14cebeSEric Cheng if (list == NULL) 3049da14cebeSEric Cheng return (dladm_errno2status(errno)); 3050da14cebeSEric Cheng 30514ac67f02SAnurag S. Maskey status = dladm_walk_linkprop(handle, linkid, list, 30524ac67f02SAnurag S. Maskey i_dladm_get_one_prop); 3053da14cebeSEric Cheng 3054da14cebeSEric Cheng *listp = list; 3055da14cebeSEric Cheng return (status); 3056da14cebeSEric Cheng } 3057da14cebeSEric Cheng 3058da14cebeSEric Cheng /* 3059da14cebeSEric Cheng * Retrieve the named property from a proplist, check the value and 3060da14cebeSEric Cheng * convert to a kernel structure. 3061da14cebeSEric Cheng */ 3062da14cebeSEric Cheng static dladm_status_t 30634ac67f02SAnurag S. Maskey i_dladm_link_proplist_extract_one(dladm_handle_t handle, 30644ac67f02SAnurag S. Maskey dladm_arg_list_t *proplist, const char *name, void *val) 3065da14cebeSEric Cheng { 3066da14cebeSEric Cheng dladm_status_t status; 3067da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3068da14cebeSEric Cheng int i, j; 3069da14cebeSEric Cheng 3070da14cebeSEric Cheng /* Find named property in proplist */ 3071da14cebeSEric Cheng for (i = 0; i < proplist->al_count; i++) { 3072da14cebeSEric Cheng aip = &proplist->al_info[i]; 3073da14cebeSEric Cheng if (strcasecmp(aip->ai_name, name) == 0) 3074da14cebeSEric Cheng break; 3075da14cebeSEric Cheng } 3076da14cebeSEric Cheng 3077da14cebeSEric Cheng /* Property not in list */ 3078da14cebeSEric Cheng if (i == proplist->al_count) 3079da14cebeSEric Cheng return (DLADM_STATUS_OK); 3080da14cebeSEric Cheng 3081da14cebeSEric Cheng for (i = 0; i < DLADM_MAX_PROPS; i++) { 3082da14cebeSEric Cheng prop_desc_t *pdp = &prop_table[i]; 3083da14cebeSEric Cheng val_desc_t *vdp; 3084da14cebeSEric Cheng 3085da14cebeSEric Cheng vdp = malloc(sizeof (val_desc_t) * aip->ai_count); 3086da14cebeSEric Cheng if (vdp == NULL) 3087da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 3088da14cebeSEric Cheng 3089da14cebeSEric Cheng if (strcasecmp(aip->ai_name, pdp->pd_name) != 0) 3090da14cebeSEric Cheng continue; 3091da14cebeSEric Cheng 3092da14cebeSEric Cheng if (aip->ai_val == NULL) 3093da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 3094da14cebeSEric Cheng 3095da14cebeSEric Cheng /* Check property value */ 3096da14cebeSEric Cheng if (pdp->pd_check != NULL) { 30974ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, 0, aip->ai_val, 3098da14cebeSEric Cheng aip->ai_count, vdp, 0); 3099da14cebeSEric Cheng } else { 3100da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3101da14cebeSEric Cheng } 3102da14cebeSEric Cheng 3103da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3104da14cebeSEric Cheng return (status); 3105da14cebeSEric Cheng 3106da14cebeSEric Cheng for (j = 0; j < DLADM_MAX_RSRC_PROP; j++) { 3107da14cebeSEric Cheng resource_prop_t *rpp = &rsrc_prop_table[j]; 3108da14cebeSEric Cheng 3109da14cebeSEric Cheng if (strcasecmp(aip->ai_name, rpp->rp_name) != 0) 3110da14cebeSEric Cheng continue; 3111da14cebeSEric Cheng 3112da14cebeSEric Cheng /* Extract kernel structure */ 3113da14cebeSEric Cheng if (rpp->rp_extract != NULL) { 3114da14cebeSEric Cheng status = rpp->rp_extract(vdp, val, 3115da14cebeSEric Cheng aip->ai_count); 3116da14cebeSEric Cheng } else { 3117da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3118da14cebeSEric Cheng } 3119da14cebeSEric Cheng break; 3120da14cebeSEric Cheng } 3121da14cebeSEric Cheng 3122da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3123da14cebeSEric Cheng return (status); 3124da14cebeSEric Cheng 3125da14cebeSEric Cheng break; 3126da14cebeSEric Cheng } 3127da14cebeSEric Cheng return (status); 3128da14cebeSEric Cheng } 3129da14cebeSEric Cheng 3130da14cebeSEric Cheng /* 3131da14cebeSEric Cheng * Extract properties from a proplist and convert to mac_resource_props_t. 3132da14cebeSEric Cheng */ 3133da14cebeSEric Cheng dladm_status_t 31344ac67f02SAnurag S. Maskey dladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist, 3135da14cebeSEric Cheng mac_resource_props_t *mrp) 3136da14cebeSEric Cheng { 3137da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3138da14cebeSEric Cheng 31394ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "maxbw", 31404ac67f02SAnurag S. Maskey mrp); 3141da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3142da14cebeSEric Cheng return (status); 31434ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "priority", 31444ac67f02SAnurag S. Maskey mrp); 3145da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3146da14cebeSEric Cheng return (status); 31474ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "cpus", 31484ac67f02SAnurag S. Maskey mrp); 3149da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3150da14cebeSEric Cheng return (status); 3151da14cebeSEric Cheng return (status); 3152da14cebeSEric Cheng } 3153da14cebeSEric Cheng 3154da14cebeSEric Cheng static const char * 3155da14cebeSEric Cheng dladm_perm2str(uint_t perm, char *buf) 3156da14cebeSEric Cheng { 3157da14cebeSEric Cheng (void) snprintf(buf, DLADM_STRSIZE, "%c%c", 3158da14cebeSEric Cheng ((perm & MAC_PROP_PERM_READ) != 0) ? 'r' : '-', 3159da14cebeSEric Cheng ((perm & MAC_PROP_PERM_WRITE) != 0) ? 'w' : '-'); 3160da14cebeSEric Cheng return (buf); 3161da14cebeSEric Cheng } 31624784fcbdSSowmini Varadhan 31634784fcbdSSowmini Varadhan dladm_status_t 31644ac67f02SAnurag S. Maskey i_dladm_get_state(dladm_handle_t handle, datalink_id_t linkid, 31654ac67f02SAnurag S. Maskey link_state_t *state) 31664784fcbdSSowmini Varadhan { 31674784fcbdSSowmini Varadhan dld_ioc_macprop_t *dip; 31684784fcbdSSowmini Varadhan dladm_status_t status; 31694784fcbdSSowmini Varadhan uint_t perms; 31704784fcbdSSowmini Varadhan 31714ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, "state", 0, &status, 31724ac67f02SAnurag S. Maskey &perms); 31734784fcbdSSowmini Varadhan if (status != DLADM_STATUS_OK) 31744784fcbdSSowmini Varadhan return (status); 31754784fcbdSSowmini Varadhan (void) memcpy(state, dip->pr_val, sizeof (*state)); 31764784fcbdSSowmini Varadhan free(dip); 31774784fcbdSSowmini Varadhan return (status); 31784784fcbdSSowmini Varadhan } 317962ee1d25SArtem Kachitchkine 318062ee1d25SArtem Kachitchkine boolean_t 318162ee1d25SArtem Kachitchkine dladm_attr_is_linkprop(const char *name) 318262ee1d25SArtem Kachitchkine { 318362ee1d25SArtem Kachitchkine /* non-property attribute names */ 318462ee1d25SArtem Kachitchkine const char *nonprop[] = { 318562ee1d25SArtem Kachitchkine /* dlmgmtd core attributes */ 318662ee1d25SArtem Kachitchkine "name", 318762ee1d25SArtem Kachitchkine "class", 318862ee1d25SArtem Kachitchkine "media", 318962ee1d25SArtem Kachitchkine FPHYMAJ, 319062ee1d25SArtem Kachitchkine FPHYINST, 319162ee1d25SArtem Kachitchkine FDEVNAME, 319262ee1d25SArtem Kachitchkine 319362ee1d25SArtem Kachitchkine /* other attributes for vlan, aggr, etc */ 319462ee1d25SArtem Kachitchkine DLADM_ATTR_NAMES 319562ee1d25SArtem Kachitchkine }; 319662ee1d25SArtem Kachitchkine boolean_t is_nonprop = B_FALSE; 319762ee1d25SArtem Kachitchkine int i; 319862ee1d25SArtem Kachitchkine 319962ee1d25SArtem Kachitchkine for (i = 0; i < sizeof (nonprop) / sizeof (nonprop[0]); i++) { 320062ee1d25SArtem Kachitchkine if (strcmp(name, nonprop[i]) == 0) { 320162ee1d25SArtem Kachitchkine is_nonprop = B_TRUE; 320262ee1d25SArtem Kachitchkine break; 320362ee1d25SArtem Kachitchkine } 320462ee1d25SArtem Kachitchkine } 320562ee1d25SArtem Kachitchkine 320662ee1d25SArtem Kachitchkine return (!is_nonprop); 320762ee1d25SArtem Kachitchkine } 3208