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> 59*4eaa4710SRishi Srivatsavai #include <sys/vlan.h> 60*4eaa4710SRishi Srivatsavai #include <libdlbridge.h> 61*4eaa4710SRishi Srivatsavai #include <stp_in.h> 62f4b3ec61Sdh155122 63d62bc4baSyz147064 /* 64d62bc4baSyz147064 * The linkprop get() callback. 65da14cebeSEric Cheng * - pd: pointer to the prop_desc_t 66d62bc4baSyz147064 * - propstrp: a property string array to keep the returned property. 67d62bc4baSyz147064 * Caller allocated. 68d62bc4baSyz147064 * - cntp: number of returned properties. 69d62bc4baSyz147064 * Caller also uses it to indicate how many it expects. 70d62bc4baSyz147064 */ 71e7801d59Ssowmini struct prop_desc; 72da14cebeSEric Cheng typedef struct prop_desc prop_desc_t; 73e7801d59Ssowmini 744ac67f02SAnurag S. Maskey typedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp, 756b9e797cSsowmini datalink_id_t, char **propstp, uint_t *cntp, 76afdda45fSVasumathi Sundaram - Sun Microsystems datalink_media_t, uint_t, uint_t *); 77f4b3ec61Sdh155122 78d62bc4baSyz147064 /* 79d62bc4baSyz147064 * The linkprop set() callback. 80d62bc4baSyz147064 * - propval: a val_desc_t array which keeps the property values to be set. 81d62bc4baSyz147064 * - cnt: number of properties to be set. 82e7801d59Ssowmini * - flags: additional flags passed down the system call. 83e7801d59Ssowmini * 84e7801d59Ssowmini * pd_set takes val_desc_t given by pd_check(), translates it into 85e7801d59Ssowmini * a format suitable for kernel consumption. This may require allocation 86e7801d59Ssowmini * of ioctl buffers etc. pd_set() may call another common routine (used 87e7801d59Ssowmini * by all other pd_sets) which invokes the ioctl. 88d62bc4baSyz147064 */ 894ac67f02SAnurag S. Maskey typedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t, 906b9e797cSsowmini val_desc_t *propval, uint_t cnt, uint_t flags, 916b9e797cSsowmini datalink_media_t); 92f4b3ec61Sdh155122 93d62bc4baSyz147064 /* 94d62bc4baSyz147064 * The linkprop check() callback. 95d62bc4baSyz147064 * - propstrp: property string array which keeps the property to be checked. 96d62bc4baSyz147064 * - cnt: number of properties. 97d62bc4baSyz147064 * - propval: return value; the property values of the given property strings. 98e7801d59Ssowmini * 99e7801d59Ssowmini * pd_check checks that the input values are valid. It does so by 100e7801d59Ssowmini * iteraring through the pd_modval list for the property. If 101e7801d59Ssowmini * the modifiable values cannot be expressed as a list, a pd_check 102e7801d59Ssowmini * specific to this property can be used. If the input values are 103e7801d59Ssowmini * verified to be valid, pd_check allocates a val_desc_t and fills it 104e7801d59Ssowmini * with either a val_desc_t found on the pd_modval list or something 105e7801d59Ssowmini * generated on the fly. 106d62bc4baSyz147064 */ 1074ac67f02SAnurag S. Maskey typedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp, 1084ac67f02SAnurag S. Maskey datalink_id_t, char **propstrp, uint_t cnt, 1094ac67f02SAnurag S. Maskey val_desc_t *propval, datalink_media_t); 110f4b3ec61Sdh155122 111bcb5c89dSSowmini Varadhan typedef struct link_attr_s { 1123fd94f8cSam223141 mac_prop_id_t pp_id; 113e7801d59Ssowmini size_t pp_valsize; 114e7801d59Ssowmini char *pp_name; 115bcb5c89dSSowmini Varadhan } link_attr_t; 116e7801d59Ssowmini 117bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t, 118bcb5c89dSSowmini Varadhan const char *, uint_t, dladm_status_t *); 119bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t, 120da14cebeSEric Cheng mac_prop_id_t, uint_t, dladm_status_t *); 1214ac67f02SAnurag S. Maskey static dld_ioc_macprop_t *i_dladm_get_public_prop(dladm_handle_t, datalink_id_t, 1224ac67f02SAnurag S. Maskey char *, uint_t, dladm_status_t *, uint_t *); 123da14cebeSEric Cheng 1243361618bSRishi Srivatsavai static dladm_status_t i_dladm_set_private_prop(dladm_handle_t, datalink_id_t, 1254ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 12662ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_get_priv_prop(dladm_handle_t, datalink_id_t, 1274ac67f02SAnurag S. Maskey const char *, char **, uint_t *, dladm_prop_type_t, 1284ac67f02SAnurag S. Maskey uint_t); 129bcb5c89dSSowmini Varadhan static link_attr_t *dladm_name2prop(const char *); 130bcb5c89dSSowmini Varadhan static link_attr_t *dladm_id2prop(mac_prop_id_t); 131da14cebeSEric Cheng 132d62bc4baSyz147064 static pd_getf_t do_get_zone, do_get_autopush, do_get_rate_mod, 133d62bc4baSyz147064 do_get_rate_prop, do_get_channel_prop, 134e7801d59Ssowmini do_get_powermode_prop, do_get_radio_prop, 1353bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_duplex_get, i_dladm_status_get, 1363bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_binary_get, i_dladm_uint32_get, 13762ee1d25SArtem Kachitchkine i_dladm_flowctl_get, i_dladm_maxbw_get, 138e75f0919SSebastien Roy i_dladm_cpus_get, i_dladm_priority_get, 139*4eaa4710SRishi Srivatsavai i_dladm_tagmode_get, i_dladm_range_get, 140*4eaa4710SRishi Srivatsavai get_stp_prop, get_bridge_forward, 141*4eaa4710SRishi Srivatsavai get_bridge_pvid; 142da14cebeSEric Cheng 1433bc21d0aSAruna Ramakrishna - Sun Microsystems static pd_setf_t do_set_zone, do_set_rate_prop, 144e7801d59Ssowmini do_set_powermode_prop, do_set_radio_prop, 145*4eaa4710SRishi Srivatsavai i_dladm_set_public_prop, do_set_res, do_set_cpus, 146*4eaa4710SRishi Srivatsavai set_stp_prop, set_bridge_forward, set_bridge_pvid; 147f4b3ec61Sdh155122 148da14cebeSEric Cheng static pd_checkf_t do_check_zone, do_check_autopush, do_check_rate, 149*4eaa4710SRishi Srivatsavai i_dladm_uint32_check, do_check_maxbw, do_check_cpus, 150*4eaa4710SRishi Srivatsavai do_check_priority, check_stp_prop, check_bridge_pvid; 151da14cebeSEric Cheng 1524ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_speed_get(dladm_handle_t, prop_desc_t *, 1534ac67f02SAnurag S. Maskey datalink_id_t, char **, uint_t *, uint_t, uint_t *); 1544ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t); 155da14cebeSEric Cheng static const char *dladm_perm2str(uint_t, char *); 1566b9e797cSsowmini 157da14cebeSEric Cheng struct prop_desc { 158d62bc4baSyz147064 /* 159d62bc4baSyz147064 * link property name 160d62bc4baSyz147064 */ 161f4b3ec61Sdh155122 char *pd_name; 162d62bc4baSyz147064 163d62bc4baSyz147064 /* 164d62bc4baSyz147064 * default property value, can be set to { "", NULL } 165d62bc4baSyz147064 */ 166f4b3ec61Sdh155122 val_desc_t pd_defval; 167d62bc4baSyz147064 168d62bc4baSyz147064 /* 169d62bc4baSyz147064 * list of optional property values, can be NULL. 170d62bc4baSyz147064 * 171d62bc4baSyz147064 * This is set to non-NULL if there is a list of possible property 172d62bc4baSyz147064 * values. pd_optval would point to the array of possible values. 173d62bc4baSyz147064 */ 174d62bc4baSyz147064 val_desc_t *pd_optval; 175d62bc4baSyz147064 176d62bc4baSyz147064 /* 177d62bc4baSyz147064 * count of the above optional property values. 0 if pd_optval is NULL. 178d62bc4baSyz147064 */ 179d62bc4baSyz147064 uint_t pd_noptval; 180d62bc4baSyz147064 181d62bc4baSyz147064 /* 182*4eaa4710SRishi Srivatsavai * callback to set link property; set to NULL if this property is 183*4eaa4710SRishi Srivatsavai * read-only and may be called before or after permanent update; see 184*4eaa4710SRishi Srivatsavai * flags. 185d62bc4baSyz147064 */ 186f4b3ec61Sdh155122 pd_setf_t *pd_set; 187d62bc4baSyz147064 188d62bc4baSyz147064 /* 189d62bc4baSyz147064 * callback to get modifiable link property 190d62bc4baSyz147064 */ 191f4b3ec61Sdh155122 pd_getf_t *pd_getmod; 192d62bc4baSyz147064 193d62bc4baSyz147064 /* 194d62bc4baSyz147064 * callback to get current link property 195d62bc4baSyz147064 */ 196f4b3ec61Sdh155122 pd_getf_t *pd_get; 197d62bc4baSyz147064 198d62bc4baSyz147064 /* 199d62bc4baSyz147064 * callback to validate link property value, set to NULL if pd_optval 200d62bc4baSyz147064 * is not NULL. In that case, validate the value by comparing it with 201d62bc4baSyz147064 * the pd_optval. Return a val_desc_t array pointer if the value is 202d62bc4baSyz147064 * valid. 203d62bc4baSyz147064 */ 204f4b3ec61Sdh155122 pd_checkf_t *pd_check; 205d62bc4baSyz147064 206d62bc4baSyz147064 uint_t pd_flags; 207e7801d59Ssowmini #define PD_TEMPONLY 0x1 /* property is temporary only */ 208e7801d59Ssowmini #define PD_CHECK_ALLOC 0x2 /* alloc vd_val as part of pd_check */ 209*4eaa4710SRishi Srivatsavai #define PD_AFTER_PERM 0x4 /* pd_set after db update; no temporary */ 210d62bc4baSyz147064 /* 211d62bc4baSyz147064 * indicate link classes this property applies to. 212d62bc4baSyz147064 */ 213d62bc4baSyz147064 datalink_class_t pd_class; 214d62bc4baSyz147064 215d62bc4baSyz147064 /* 216d62bc4baSyz147064 * indicate link media type this property applies to. 217d62bc4baSyz147064 */ 218d62bc4baSyz147064 datalink_media_t pd_dmedia; 219da14cebeSEric Cheng }; 220f4b3ec61Sdh155122 2213fd94f8cSam223141 #define MAC_PROP_BUFSIZE(v) sizeof (dld_ioc_macprop_t) + (v) - 1 222e7801d59Ssowmini 223bcb5c89dSSowmini Varadhan /* 224bcb5c89dSSowmini Varadhan * Supported link properties enumerated in the prop_table[] array are 225bcb5c89dSSowmini Varadhan * computed using the callback functions in that array. To compute the 226bcb5c89dSSowmini Varadhan * property value, multiple distinct system calls may be needed (e.g., 227bcb5c89dSSowmini Varadhan * for wifi speed, we need to issue system calls to get desired/supported 228bcb5c89dSSowmini Varadhan * rates). The link_attr[] table enumerates the interfaces to the kernel, 229bcb5c89dSSowmini Varadhan * and the type/size of the data passed in the user-kernel interface. 230bcb5c89dSSowmini Varadhan */ 231bcb5c89dSSowmini Varadhan static link_attr_t link_attr[] = { 232bcb5c89dSSowmini Varadhan { MAC_PROP_DUPLEX, sizeof (link_duplex_t), "duplex"}, 233e7801d59Ssowmini 234bcb5c89dSSowmini Varadhan { MAC_PROP_SPEED, sizeof (uint64_t), "speed"}, 235e7801d59Ssowmini 236bcb5c89dSSowmini Varadhan { MAC_PROP_STATUS, sizeof (link_state_t), "state"}, 237e7801d59Ssowmini 238bcb5c89dSSowmini Varadhan { MAC_PROP_AUTONEG, sizeof (uint8_t), "adv_autoneg_cap"}, 239e7801d59Ssowmini 240bcb5c89dSSowmini Varadhan { MAC_PROP_MTU, sizeof (uint32_t), "mtu"}, 241e7801d59Ssowmini 242bcb5c89dSSowmini Varadhan { MAC_PROP_FLOWCTRL, sizeof (link_flowctrl_t), "flowctrl"}, 243e7801d59Ssowmini 244bcb5c89dSSowmini Varadhan { MAC_PROP_ZONE, sizeof (dld_ioc_zid_t), "zone"}, 245e7801d59Ssowmini 246bcb5c89dSSowmini Varadhan { MAC_PROP_AUTOPUSH, sizeof (struct dlautopush), "autopush"}, 2473bc21d0aSAruna Ramakrishna - Sun Microsystems 248aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_ADV_10GFDX_CAP, sizeof (uint8_t), "adv_10gfdx_cap"}, 249aca118b7Slucy wang - Sun Microsystems - Beijing China 250aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_EN_10GFDX_CAP, sizeof (uint8_t), "en_10gfdx_cap"}, 251aca118b7Slucy wang - Sun Microsystems - Beijing China 252bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000FDX_CAP, sizeof (uint8_t), "adv_1000fdx_cap"}, 2533bc21d0aSAruna Ramakrishna - Sun Microsystems 254bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000FDX_CAP, sizeof (uint8_t), "en_1000fdx_cap"}, 255e7801d59Ssowmini 256bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000HDX_CAP, sizeof (uint8_t), "adv_1000hdx_cap"}, 257e7801d59Ssowmini 258bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000HDX_CAP, sizeof (uint8_t), "en_1000hdx_cap"}, 259e7801d59Ssowmini 260bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100FDX_CAP, sizeof (uint8_t), "adv_100fdx_cap"}, 261e7801d59Ssowmini 262bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100FDX_CAP, sizeof (uint8_t), "en_100fdx_cap"}, 263e7801d59Ssowmini 264bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100HDX_CAP, sizeof (uint8_t), "adv_100hdx_cap"}, 265e7801d59Ssowmini 266bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100HDX_CAP, sizeof (uint8_t), "en_100hdx_cap"}, 267e7801d59Ssowmini 268bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10FDX_CAP, sizeof (uint8_t), "adv_10fdx_cap"}, 269e7801d59Ssowmini 270bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10FDX_CAP, sizeof (uint8_t), "en_10fdx_cap"}, 271e7801d59Ssowmini 272bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10HDX_CAP, sizeof (uint8_t), "adv_10hdx_cap"}, 273e7801d59Ssowmini 274bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10HDX_CAP, sizeof (uint8_t), "en_10hdx_cap"}, 275e7801d59Ssowmini 276bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESSID, sizeof (wl_linkstatus_t), "essid"}, 277e7801d59Ssowmini 278bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSID, sizeof (wl_bssid_t), "bssid"}, 279bcb5c89dSSowmini Varadhan 280bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSTYPE, sizeof (wl_bss_type_t), "bsstype"}, 281bcb5c89dSSowmini Varadhan 282bcb5c89dSSowmini Varadhan { MAC_PROP_WL_LINKSTATUS, sizeof (wl_linkstatus_t), "wl_linkstatus"}, 283bcb5c89dSSowmini Varadhan 284bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 285bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DESIRED_RATES, sizeof (wl_rates_t), "desired_rates"}, 286bcb5c89dSSowmini Varadhan 287bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 288bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SUPPORTED_RATES, sizeof (wl_rates_t), "supported_rates"}, 289bcb5c89dSSowmini Varadhan 290bcb5c89dSSowmini Varadhan { MAC_PROP_WL_AUTH_MODE, sizeof (wl_authmode_t), "authmode"}, 291bcb5c89dSSowmini Varadhan 292bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ENCRYPTION, sizeof (wl_encryption_t), "encryption"}, 293bcb5c89dSSowmini Varadhan 294bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RSSI, sizeof (wl_rssi_t), "signal"}, 295bcb5c89dSSowmini Varadhan 296bcb5c89dSSowmini Varadhan { MAC_PROP_WL_PHY_CONFIG, sizeof (wl_phy_conf_t), "phy_conf"}, 297bcb5c89dSSowmini Varadhan 298bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CAPABILITY, sizeof (wl_capability_t), "capability"}, 299bcb5c89dSSowmini Varadhan 300bcb5c89dSSowmini Varadhan { MAC_PROP_WL_WPA, sizeof (wl_wpa_t), "wpa"}, 301bcb5c89dSSowmini Varadhan 302bcb5c89dSSowmini Varadhan /* wl_wpa_ess_t has variable length */ 303bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SCANRESULTS, sizeof (wl_wpa_ess_t), "scan_results"}, 304bcb5c89dSSowmini Varadhan 305bcb5c89dSSowmini Varadhan { MAC_PROP_WL_POWER_MODE, sizeof (wl_ps_mode_t), "powermode"}, 306bcb5c89dSSowmini Varadhan 307bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RADIO, sizeof (dladm_wlan_radio_t), "wl_radio"}, 308bcb5c89dSSowmini Varadhan 309bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESS_LIST, sizeof (wl_ess_list_t), "wl_ess_list"}, 310bcb5c89dSSowmini Varadhan 311bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY_TAB, sizeof (wl_wep_key_tab_t), "wl_wep_key"}, 312bcb5c89dSSowmini Varadhan 313bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CREATE_IBSS, sizeof (wl_create_ibss_t), "createibss"}, 314bcb5c89dSSowmini Varadhan 315bcb5c89dSSowmini Varadhan /* wl_wpa_ie_t has variable length */ 316bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SETOPTIE, sizeof (wl_wpa_ie_t), "set_ie"}, 317bcb5c89dSSowmini Varadhan 318bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DELKEY, sizeof (wl_del_key_t), "wpa_del_key"}, 319bcb5c89dSSowmini Varadhan 320bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY, sizeof (wl_key_t), "wl_key"}, 321bcb5c89dSSowmini Varadhan 322bcb5c89dSSowmini Varadhan { MAC_PROP_WL_MLME, sizeof (wl_mlme_t), "mlme"}, 323bcb5c89dSSowmini Varadhan 324da14cebeSEric Cheng { MAC_PROP_MAXBW, sizeof (mac_resource_props_t), "maxbw"}, 325da14cebeSEric Cheng 326da14cebeSEric Cheng { MAC_PROP_PRIO, sizeof (mac_resource_props_t), "priority"}, 327da14cebeSEric Cheng 328da14cebeSEric Cheng { MAC_PROP_BIND_CPU, sizeof (mac_resource_props_t), "cpus"}, 329da14cebeSEric Cheng 330e75f0919SSebastien Roy { MAC_PROP_TAGMODE, sizeof (link_tagmode_t), "tagmode"}, 331e75f0919SSebastien Roy 332*4eaa4710SRishi Srivatsavai { MAC_PROP_PVID, sizeof (uint16_t), "default_tag"}, 333*4eaa4710SRishi Srivatsavai 334*4eaa4710SRishi Srivatsavai { MAC_PROP_LLIMIT, sizeof (uint32_t), "learn_limit"}, 335*4eaa4710SRishi Srivatsavai 336*4eaa4710SRishi Srivatsavai { MAC_PROP_LDECAY, sizeof (uint32_t), "learn_decay"}, 337*4eaa4710SRishi Srivatsavai 338bcb5c89dSSowmini Varadhan { MAC_PROP_PRIVATE, 0, "driver-private"} 339da14cebeSEric Cheng 340e7801d59Ssowmini }; 341e7801d59Ssowmini 342*4eaa4710SRishi Srivatsavai typedef struct bridge_public_prop_s { 343*4eaa4710SRishi Srivatsavai const char *bpp_name; 344*4eaa4710SRishi Srivatsavai int bpp_code; 345*4eaa4710SRishi Srivatsavai } bridge_public_prop_t; 346*4eaa4710SRishi Srivatsavai 347*4eaa4710SRishi Srivatsavai static const bridge_public_prop_t bridge_prop[] = { 348*4eaa4710SRishi Srivatsavai { "stp", PT_CFG_NON_STP }, 349*4eaa4710SRishi Srivatsavai { "stp_priority", PT_CFG_PRIO }, 350*4eaa4710SRishi Srivatsavai { "stp_cost", PT_CFG_COST }, 351*4eaa4710SRishi Srivatsavai { "stp_edge", PT_CFG_EDGE }, 352*4eaa4710SRishi Srivatsavai { "stp_p2p", PT_CFG_P2P }, 353*4eaa4710SRishi Srivatsavai { "stp_mcheck", PT_CFG_MCHECK }, 354*4eaa4710SRishi Srivatsavai { NULL, 0 } 355*4eaa4710SRishi Srivatsavai }; 356*4eaa4710SRishi Srivatsavai 357e7801d59Ssowmini static val_desc_t link_duplex_vals[] = { 358e7801d59Ssowmini { "half", LINK_DUPLEX_HALF }, 359e7801d59Ssowmini { "full", LINK_DUPLEX_HALF } 360e7801d59Ssowmini }; 361e7801d59Ssowmini static val_desc_t link_status_vals[] = { 362e7801d59Ssowmini { "up", LINK_STATE_UP }, 363e7801d59Ssowmini { "down", LINK_STATE_DOWN } 364e7801d59Ssowmini }; 365e7801d59Ssowmini static val_desc_t link_01_vals[] = { 366e7801d59Ssowmini { "1", 1 }, 367e7801d59Ssowmini { "0", 0 } 368e7801d59Ssowmini }; 369e7801d59Ssowmini static val_desc_t link_flow_vals[] = { 370e7801d59Ssowmini { "no", LINK_FLOWCTRL_NONE }, 371e7801d59Ssowmini { "tx", LINK_FLOWCTRL_TX }, 372e7801d59Ssowmini { "rx", LINK_FLOWCTRL_RX }, 373e7801d59Ssowmini { "bi", LINK_FLOWCTRL_BI } 374e7801d59Ssowmini }; 375da14cebeSEric Cheng static val_desc_t link_priority_vals[] = { 376da14cebeSEric Cheng { "low", MPL_LOW }, 377da14cebeSEric Cheng { "medium", MPL_MEDIUM }, 378da14cebeSEric Cheng { "high", MPL_HIGH } 379da14cebeSEric Cheng }; 380e7801d59Ssowmini 381e75f0919SSebastien Roy static val_desc_t link_tagmode_vals[] = { 382e75f0919SSebastien Roy { "normal", LINK_TAGMODE_NORMAL }, 383e75f0919SSebastien Roy { "vlanonly", LINK_TAGMODE_VLANONLY } 384e75f0919SSebastien Roy }; 385e75f0919SSebastien Roy 386d62bc4baSyz147064 static val_desc_t dladm_wlan_radio_vals[] = { 387d62bc4baSyz147064 { "on", DLADM_WLAN_RADIO_ON }, 388d62bc4baSyz147064 { "off", DLADM_WLAN_RADIO_OFF } 389d62bc4baSyz147064 }; 390d62bc4baSyz147064 391d62bc4baSyz147064 static val_desc_t dladm_wlan_powermode_vals[] = { 392d62bc4baSyz147064 { "off", DLADM_WLAN_PM_OFF }, 393d62bc4baSyz147064 { "fast", DLADM_WLAN_PM_FAST }, 394d62bc4baSyz147064 { "max", DLADM_WLAN_PM_MAX } 395d62bc4baSyz147064 }; 396d62bc4baSyz147064 397*4eaa4710SRishi Srivatsavai static val_desc_t stp_p2p_vals[] = { 398*4eaa4710SRishi Srivatsavai { "true", P2P_FORCE_TRUE }, 399*4eaa4710SRishi Srivatsavai { "false", P2P_FORCE_FALSE }, 400*4eaa4710SRishi Srivatsavai { "auto", P2P_AUTO } 401*4eaa4710SRishi Srivatsavai }; 402*4eaa4710SRishi Srivatsavai 403da14cebeSEric Cheng #define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) 404da14cebeSEric Cheng #define RESET_VAL ((uintptr_t)-1) 405d62bc4baSyz147064 406da14cebeSEric Cheng static prop_desc_t prop_table[] = { 407e7801d59Ssowmini { "channel", { NULL, 0 }, 408e7801d59Ssowmini NULL, 0, NULL, NULL, 409d62bc4baSyz147064 do_get_channel_prop, NULL, 0, 410d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 411d62bc4baSyz147064 412d62bc4baSyz147064 { "powermode", { "off", DLADM_WLAN_PM_OFF }, 413d62bc4baSyz147064 dladm_wlan_powermode_vals, VALCNT(dladm_wlan_powermode_vals), 414d62bc4baSyz147064 do_set_powermode_prop, NULL, 415d62bc4baSyz147064 do_get_powermode_prop, NULL, 0, 416d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 417d62bc4baSyz147064 418d62bc4baSyz147064 { "radio", { "on", DLADM_WLAN_RADIO_ON }, 419d62bc4baSyz147064 dladm_wlan_radio_vals, VALCNT(dladm_wlan_radio_vals), 420d62bc4baSyz147064 do_set_radio_prop, NULL, 421d62bc4baSyz147064 do_get_radio_prop, NULL, 0, 422d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 423d62bc4baSyz147064 424d62bc4baSyz147064 { "speed", { "", 0 }, NULL, 0, 425d62bc4baSyz147064 do_set_rate_prop, do_get_rate_mod, 426d62bc4baSyz147064 do_get_rate_prop, do_check_rate, 0, 4276b9e797cSsowmini DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE }, 428d62bc4baSyz147064 4294045d941Ssowmini { "autopush", { "", 0 }, NULL, 0, 4303bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, 4313bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_autopush, do_check_autopush, PD_CHECK_ALLOC, 432d62bc4baSyz147064 DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 433d62bc4baSyz147064 4344045d941Ssowmini { "zone", { "", 0 }, NULL, 0, 435f4b3ec61Sdh155122 do_set_zone, NULL, 4363bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_zone, do_check_zone, PD_TEMPONLY|PD_CHECK_ALLOC, 437e7801d59Ssowmini DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 438e7801d59Ssowmini 4394045d941Ssowmini { "duplex", { "", 0 }, 440e7801d59Ssowmini link_duplex_vals, VALCNT(link_duplex_vals), 4413bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_duplex_get, NULL, 442e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 443e7801d59Ssowmini 4446b9e797cSsowmini { "state", { "up", LINK_STATE_UP }, 445e7801d59Ssowmini link_status_vals, VALCNT(link_status_vals), 4463bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_status_get, NULL, 4474045d941Ssowmini 0, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 448e7801d59Ssowmini 4490b8f0546SSowmini Varadhan { "adv_autoneg_cap", { "", 0 }, 450e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4513bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 452e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 453e7801d59Ssowmini 4544045d941Ssowmini { "mtu", { "", 0 }, NULL, 0, 455f0f2c3a5SGirish Moodalbail i_dladm_set_public_prop, i_dladm_range_get, 456*4eaa4710SRishi Srivatsavai i_dladm_uint32_get, i_dladm_uint32_check, 0, DATALINK_CLASS_ALL, 4573bc21d0aSAruna Ramakrishna - Sun Microsystems DATALINK_ANY_MEDIATYPE }, 458e7801d59Ssowmini 4594045d941Ssowmini { "flowctrl", { "", 0 }, 460e7801d59Ssowmini link_flow_vals, VALCNT(link_flow_vals), 4613bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_flowctl_get, NULL, 462e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 463e7801d59Ssowmini 464aca118b7Slucy wang - Sun Microsystems - Beijing China { "adv_10gfdx_cap", { "", 0 }, 465aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 466aca118b7Slucy wang - Sun Microsystems - Beijing China NULL, NULL, i_dladm_binary_get, NULL, 467aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 468aca118b7Slucy wang - Sun Microsystems - Beijing China 469aca118b7Slucy wang - Sun Microsystems - Beijing China { "en_10gfdx_cap", { "", 0 }, 470aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 471aca118b7Slucy wang - Sun Microsystems - Beijing China i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 472aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 473aca118b7Slucy wang - Sun Microsystems - Beijing China 4744045d941Ssowmini { "adv_1000fdx_cap", { "", 0 }, 4754045d941Ssowmini link_01_vals, VALCNT(link_01_vals), 4763bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 477e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 478e7801d59Ssowmini 4794045d941Ssowmini { "en_1000fdx_cap", { "", 0 }, 480e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4813bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 482e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 483e7801d59Ssowmini 4844045d941Ssowmini { "adv_1000hdx_cap", { "", 0 }, 485e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4863bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 487e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 488e7801d59Ssowmini 4894045d941Ssowmini { "en_1000hdx_cap", { "", 0 }, 490e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4913bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 492e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 493e7801d59Ssowmini 4944045d941Ssowmini { "adv_100fdx_cap", { "", 0 }, 495e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4963bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 497e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 498e7801d59Ssowmini 4994045d941Ssowmini { "en_100fdx_cap", { "", 0 }, 500e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5013bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 502e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 503e7801d59Ssowmini 5044045d941Ssowmini { "adv_100hdx_cap", { "", 0 }, 505e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5063bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 507e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 508e7801d59Ssowmini 5094045d941Ssowmini { "en_100hdx_cap", { "", 0 }, 510e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5113bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 512e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 513e7801d59Ssowmini 5144045d941Ssowmini { "adv_10fdx_cap", { "", 0 }, 515e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5163bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 517e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 518e7801d59Ssowmini 5194045d941Ssowmini { "en_10fdx_cap", { "", 0 }, 520e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5213bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 522e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 523e7801d59Ssowmini 5244045d941Ssowmini { "adv_10hdx_cap", { "", 0 }, 525e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5263bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 527e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 528e7801d59Ssowmini 5294045d941Ssowmini { "en_10hdx_cap", { "", 0 }, 530e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5313bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 532da14cebeSEric Cheng 0, DATALINK_CLASS_PHYS, DL_ETHER }, 533e7801d59Ssowmini 534da14cebeSEric Cheng { "maxbw", { "--", RESET_VAL }, NULL, 0, 535da14cebeSEric Cheng do_set_res, NULL, 53662ee1d25SArtem Kachitchkine i_dladm_maxbw_get, do_check_maxbw, PD_CHECK_ALLOC, 537da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 538da14cebeSEric Cheng 539da14cebeSEric Cheng { "cpus", { "--", RESET_VAL }, NULL, 0, 540da14cebeSEric Cheng do_set_cpus, NULL, 54162ee1d25SArtem Kachitchkine i_dladm_cpus_get, do_check_cpus, 0, 542da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 543da14cebeSEric Cheng 544da14cebeSEric Cheng { "priority", { "high", RESET_VAL }, 545da14cebeSEric Cheng link_priority_vals, VALCNT(link_priority_vals), do_set_res, NULL, 54662ee1d25SArtem Kachitchkine i_dladm_priority_get, do_check_priority, PD_CHECK_ALLOC, 547da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 548e75f0919SSebastien Roy 549e75f0919SSebastien Roy { "tagmode", { "vlanonly", LINK_TAGMODE_VLANONLY }, 550e75f0919SSebastien Roy link_tagmode_vals, VALCNT(link_tagmode_vals), 551e75f0919SSebastien Roy i_dladm_set_public_prop, NULL, i_dladm_tagmode_get, 552e75f0919SSebastien Roy NULL, 0, 553e75f0919SSebastien Roy DATALINK_CLASS_PHYS | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC, 554*4eaa4710SRishi Srivatsavai DL_ETHER }, 555*4eaa4710SRishi Srivatsavai 556*4eaa4710SRishi Srivatsavai { "forward", { "1", 1 }, 557*4eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 558*4eaa4710SRishi Srivatsavai set_bridge_forward, NULL, get_bridge_forward, NULL, PD_AFTER_PERM, 559*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ALL & ~DATALINK_CLASS_VNIC, DL_ETHER }, 560*4eaa4710SRishi Srivatsavai 561*4eaa4710SRishi Srivatsavai { "default_tag", { "1", 1 }, NULL, 0, 562*4eaa4710SRishi Srivatsavai set_bridge_pvid, NULL, get_bridge_pvid, check_bridge_pvid, 563*4eaa4710SRishi Srivatsavai 0, DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 564*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 565*4eaa4710SRishi Srivatsavai 566*4eaa4710SRishi Srivatsavai { "learn_limit", { "1000", 1000 }, NULL, 0, 567*4eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 568*4eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 569*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 570*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 571*4eaa4710SRishi Srivatsavai 572*4eaa4710SRishi Srivatsavai { "learn_decay", { "200", 200 }, NULL, 0, 573*4eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 574*4eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 575*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 576*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 577*4eaa4710SRishi Srivatsavai 578*4eaa4710SRishi Srivatsavai { "stp", { "1", 1 }, 579*4eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 580*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 581*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 582*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 583*4eaa4710SRishi Srivatsavai 584*4eaa4710SRishi Srivatsavai { "stp_priority", { "128", 128 }, NULL, 0, 585*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 586*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 587*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 588*4eaa4710SRishi Srivatsavai 589*4eaa4710SRishi Srivatsavai { "stp_cost", { "auto", 0 }, NULL, 0, 590*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 591*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 592*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 593*4eaa4710SRishi Srivatsavai 594*4eaa4710SRishi Srivatsavai { "stp_edge", { "1", 1 }, 595*4eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 596*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 597*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 598*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 599*4eaa4710SRishi Srivatsavai 600*4eaa4710SRishi Srivatsavai { "stp_p2p", { "auto", P2P_AUTO }, 601*4eaa4710SRishi Srivatsavai stp_p2p_vals, VALCNT(stp_p2p_vals), 602*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 603*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 604*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 605*4eaa4710SRishi Srivatsavai 606*4eaa4710SRishi Srivatsavai { "stp_mcheck", { "0", 0 }, 607*4eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 608*4eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 609*4eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 610*4eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 611f4b3ec61Sdh155122 }; 612f4b3ec61Sdh155122 613d62bc4baSyz147064 #define DLADM_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t)) 6140ba2cbe9Sxc151355 615da14cebeSEric Cheng static resource_prop_t rsrc_prop_table[] = { 616da14cebeSEric Cheng {"maxbw", do_extract_maxbw}, 617da14cebeSEric Cheng {"priority", do_extract_priority}, 618da14cebeSEric Cheng {"cpus", do_extract_cpus} 619da14cebeSEric Cheng }; 620da14cebeSEric Cheng #define DLADM_MAX_RSRC_PROP (sizeof (rsrc_prop_table) / \ 621da14cebeSEric Cheng sizeof (resource_prop_t)) 622da14cebeSEric Cheng 623bcb5c89dSSowmini Varadhan /* 624bcb5c89dSSowmini Varadhan * when retrieving private properties, we pass down a buffer with 625bcb5c89dSSowmini Varadhan * DLADM_PROP_BUF_CHUNK of space for the driver to return the property value. 626bcb5c89dSSowmini Varadhan */ 627bcb5c89dSSowmini Varadhan #define DLADM_PROP_BUF_CHUNK 1024 628bcb5c89dSSowmini Varadhan 6294ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t, 6304ac67f02SAnurag S. Maskey const char *, char **, uint_t); 6314ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t, 6324ac67f02SAnurag S. Maskey const char *, char **, uint_t *); 63362ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_walk_linkprop_priv_db(dladm_handle_t, 63462ee1d25SArtem Kachitchkine datalink_id_t, void *, int (*)(dladm_handle_t, 63562ee1d25SArtem Kachitchkine datalink_id_t, const char *, void *)); 6364ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t, 6374ac67f02SAnurag S. Maskey datalink_class_t, uint32_t, prop_desc_t *, char **, 6384ac67f02SAnurag S. Maskey uint_t, uint_t); 6394ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t, 6404ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 6414ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *, 6424ac67f02SAnurag S. Maskey datalink_id_t, datalink_media_t, uint_t); 643da14cebeSEric Cheng 644d62bc4baSyz147064 /* 645d62bc4baSyz147064 * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all 646d62bc4baSyz147064 * rates to be retrieved. However, we cannot increase it at this 647d62bc4baSyz147064 * time because it will break binary compatibility with unbundled 648d62bc4baSyz147064 * WiFi drivers and utilities. So for now we define an additional 649d62bc4baSyz147064 * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved. 650d62bc4baSyz147064 */ 651d62bc4baSyz147064 #define MAX_SUPPORT_RATES 64 652d62bc4baSyz147064 653d62bc4baSyz147064 #define AP_ANCHOR "[anchor]" 654d62bc4baSyz147064 #define AP_DELIMITER '.' 655d62bc4baSyz147064 656d62bc4baSyz147064 static dladm_status_t 657d62bc4baSyz147064 do_check_prop(prop_desc_t *pdp, char **prop_val, uint_t val_cnt, 658d62bc4baSyz147064 val_desc_t *vdp) 6590ba2cbe9Sxc151355 { 660d62bc4baSyz147064 int i, j; 6610ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 6620ba2cbe9Sxc151355 663d62bc4baSyz147064 for (j = 0; j < val_cnt; j++) { 664d62bc4baSyz147064 for (i = 0; i < pdp->pd_noptval; i++) { 665d62bc4baSyz147064 if (strcasecmp(*prop_val, 666d62bc4baSyz147064 pdp->pd_optval[i].vd_name) == 0) { 6670ba2cbe9Sxc151355 break; 6680ba2cbe9Sxc151355 } 6690ba2cbe9Sxc151355 } 670d62bc4baSyz147064 if (i == pdp->pd_noptval) { 671d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 672d62bc4baSyz147064 goto done; 673d62bc4baSyz147064 } 674d62bc4baSyz147064 (void) memcpy(vdp + j, &pdp->pd_optval[i], sizeof (val_desc_t)); 6750ba2cbe9Sxc151355 } 6760ba2cbe9Sxc151355 677d62bc4baSyz147064 done: 678d62bc4baSyz147064 return (status); 6790ba2cbe9Sxc151355 } 6800ba2cbe9Sxc151355 6810ba2cbe9Sxc151355 static dladm_status_t 6824ac67f02SAnurag S. Maskey i_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid, 6834ac67f02SAnurag S. Maskey datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val, 6844ac67f02SAnurag S. Maskey uint_t val_cnt, uint_t flags) 6850ba2cbe9Sxc151355 { 6860ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 687d62bc4baSyz147064 val_desc_t *vdp = NULL; 688d62bc4baSyz147064 boolean_t needfree = B_FALSE; 689d62bc4baSyz147064 uint_t cnt, i; 6900ba2cbe9Sxc151355 691d62bc4baSyz147064 if (!(pdp->pd_class & class)) 692d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 6930ba2cbe9Sxc151355 694d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 695d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 696d62bc4baSyz147064 697d62bc4baSyz147064 if ((flags & DLADM_OPT_PERSIST) && (pdp->pd_flags & PD_TEMPONLY)) 698d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 699d62bc4baSyz147064 700d62bc4baSyz147064 if (!(flags & DLADM_OPT_ACTIVE)) 701d62bc4baSyz147064 return (DLADM_STATUS_OK); 702d62bc4baSyz147064 703d62bc4baSyz147064 if (pdp->pd_set == NULL) 704d62bc4baSyz147064 return (DLADM_STATUS_PROPRDONLY); 705d62bc4baSyz147064 706d62bc4baSyz147064 if (prop_val != NULL) { 707d62bc4baSyz147064 vdp = malloc(sizeof (val_desc_t) * val_cnt); 708d62bc4baSyz147064 if (vdp == NULL) 709d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 710d62bc4baSyz147064 711d62bc4baSyz147064 if (pdp->pd_check != NULL) { 712da14cebeSEric Cheng needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0); 7134ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, prop_val, 7144ac67f02SAnurag S. Maskey val_cnt, vdp, media); 715d62bc4baSyz147064 } else if (pdp->pd_optval != NULL) { 716d62bc4baSyz147064 status = do_check_prop(pdp, prop_val, val_cnt, vdp); 717d62bc4baSyz147064 } else { 718d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 7190ba2cbe9Sxc151355 } 7200ba2cbe9Sxc151355 721d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 722d62bc4baSyz147064 goto done; 723d62bc4baSyz147064 724d62bc4baSyz147064 cnt = val_cnt; 725d62bc4baSyz147064 } else { 726da14cebeSEric Cheng boolean_t defval = B_FALSE; 727da14cebeSEric Cheng 728d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) 729d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 730d62bc4baSyz147064 7313bc21d0aSAruna Ramakrishna - Sun Microsystems cnt = 1; 732da14cebeSEric Cheng defval = (strlen(pdp->pd_defval.vd_name) > 0); 733da14cebeSEric Cheng if ((pdp->pd_flags & PD_CHECK_ALLOC) != 0 || defval) { 734d62bc4baSyz147064 if ((vdp = malloc(sizeof (val_desc_t))) == NULL) 735d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 7363bc21d0aSAruna Ramakrishna - Sun Microsystems 737da14cebeSEric Cheng if (defval) { 738da14cebeSEric Cheng (void) memcpy(vdp, &pdp->pd_defval, 739da14cebeSEric Cheng sizeof (val_desc_t)); 740da14cebeSEric Cheng } else if (pdp->pd_check != NULL) { 7414ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, 7424ac67f02SAnurag S. Maskey prop_val, cnt, vdp, media); 7433bc21d0aSAruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK) 7443bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 7453bc21d0aSAruna Ramakrishna - Sun Microsystems } 7464045d941Ssowmini } else { 7474ac67f02SAnurag S. Maskey status = i_dladm_getset_defval(handle, pdp, linkid, 7484045d941Ssowmini media, flags); 7494045d941Ssowmini return (status); 7504045d941Ssowmini } 751d62bc4baSyz147064 } 752*4eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_AFTER_PERM) 753*4eaa4710SRishi Srivatsavai status = (flags & DLADM_OPT_PERSIST) ? DLADM_STATUS_OK : 754*4eaa4710SRishi Srivatsavai DLADM_STATUS_PERMONLY; 755*4eaa4710SRishi Srivatsavai else 756*4eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags, 757*4eaa4710SRishi Srivatsavai media); 758d62bc4baSyz147064 if (needfree) { 759d62bc4baSyz147064 for (i = 0; i < cnt; i++) 760e7801d59Ssowmini free((void *)((val_desc_t *)vdp + i)->vd_val); 761d62bc4baSyz147064 } 762d62bc4baSyz147064 done: 763d62bc4baSyz147064 free(vdp); 764d62bc4baSyz147064 return (status); 765d62bc4baSyz147064 } 766d62bc4baSyz147064 767d62bc4baSyz147064 static dladm_status_t 7684ac67f02SAnurag S. Maskey i_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 7694ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 770d62bc4baSyz147064 { 771d62bc4baSyz147064 int i; 772d62bc4baSyz147064 boolean_t found = B_FALSE; 773d62bc4baSyz147064 datalink_class_t class; 774d62bc4baSyz147064 uint32_t media; 775d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 776d62bc4baSyz147064 7774ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 7784ac67f02SAnurag S. Maskey NULL, 0); 779d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 7800ba2cbe9Sxc151355 return (status); 7810ba2cbe9Sxc151355 782d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 783d62bc4baSyz147064 prop_desc_t *pdp = &prop_table[i]; 784d62bc4baSyz147064 dladm_status_t s; 7850ba2cbe9Sxc151355 786d62bc4baSyz147064 if (prop_name != NULL && 787d62bc4baSyz147064 (strcasecmp(prop_name, pdp->pd_name) != 0)) 788d62bc4baSyz147064 continue; 789d62bc4baSyz147064 found = B_TRUE; 7904ac67f02SAnurag S. Maskey s = i_dladm_set_single_prop(handle, linkid, class, media, pdp, 7914ac67f02SAnurag S. Maskey prop_val, val_cnt, flags); 792d62bc4baSyz147064 793d62bc4baSyz147064 if (prop_name != NULL) { 794d62bc4baSyz147064 status = s; 795d62bc4baSyz147064 break; 796d62bc4baSyz147064 } else { 797d62bc4baSyz147064 if (s != DLADM_STATUS_OK && 798d62bc4baSyz147064 s != DLADM_STATUS_NOTSUP) 799d62bc4baSyz147064 status = s; 800d62bc4baSyz147064 } 801d62bc4baSyz147064 } 802e7801d59Ssowmini if (!found) { 803e7801d59Ssowmini if (prop_name[0] == '_') { 804e7801d59Ssowmini /* other private properties */ 8053361618bSRishi Srivatsavai status = i_dladm_set_private_prop(handle, linkid, 8063361618bSRishi Srivatsavai prop_name, prop_val, val_cnt, flags); 807e7801d59Ssowmini } else { 8080ba2cbe9Sxc151355 status = DLADM_STATUS_NOTFOUND; 809e7801d59Ssowmini } 810e7801d59Ssowmini } 8110ba2cbe9Sxc151355 8120ba2cbe9Sxc151355 return (status); 8130ba2cbe9Sxc151355 } 8140ba2cbe9Sxc151355 815d62bc4baSyz147064 /* 816d62bc4baSyz147064 * Set/reset link property for specific link 817d62bc4baSyz147064 */ 818d62bc4baSyz147064 dladm_status_t 8194ac67f02SAnurag S. Maskey dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 8204ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 8210ba2cbe9Sxc151355 { 822d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 8230ba2cbe9Sxc151355 824d62bc4baSyz147064 if ((linkid == DATALINK_INVALID_LINKID) || (flags == 0) || 825d62bc4baSyz147064 (prop_val == NULL && val_cnt > 0) || 826d62bc4baSyz147064 (prop_val != NULL && val_cnt == 0) || 827d62bc4baSyz147064 (prop_name == NULL && prop_val != NULL)) { 828d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 8290ba2cbe9Sxc151355 } 8300ba2cbe9Sxc151355 8313361618bSRishi Srivatsavai /* 8323361618bSRishi Srivatsavai * Check for valid link property against the flags passed 8333361618bSRishi Srivatsavai * and set the link property when active flag is passed. 8343361618bSRishi Srivatsavai */ 8354ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val, 836d62bc4baSyz147064 val_cnt, flags); 837d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 838d62bc4baSyz147064 return (status); 839d62bc4baSyz147064 840d62bc4baSyz147064 if (flags & DLADM_OPT_PERSIST) { 8414ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop_db(handle, linkid, prop_name, 842d62bc4baSyz147064 prop_val, val_cnt); 843*4eaa4710SRishi Srivatsavai 844*4eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK && (flags & DLADM_OPT_ACTIVE)) { 845*4eaa4710SRishi Srivatsavai prop_desc_t *pdp = prop_table; 846*4eaa4710SRishi Srivatsavai int i; 847*4eaa4710SRishi Srivatsavai 848*4eaa4710SRishi Srivatsavai for (i = 0; i < DLADM_MAX_PROPS; i++, pdp++) { 849*4eaa4710SRishi Srivatsavai if (!(pdp->pd_flags & PD_AFTER_PERM)) 850*4eaa4710SRishi Srivatsavai continue; 851*4eaa4710SRishi Srivatsavai if (prop_name != NULL && 852*4eaa4710SRishi Srivatsavai strcasecmp(prop_name, pdp->pd_name) != 0) 853*4eaa4710SRishi Srivatsavai continue; 854*4eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, NULL, 855*4eaa4710SRishi Srivatsavai 0, flags, 0); 856*4eaa4710SRishi Srivatsavai } 857*4eaa4710SRishi Srivatsavai } 858d62bc4baSyz147064 } 859d62bc4baSyz147064 return (status); 860d62bc4baSyz147064 } 861d62bc4baSyz147064 862d62bc4baSyz147064 /* 86362ee1d25SArtem Kachitchkine * Walk all link properties of the given specific link. 86462ee1d25SArtem Kachitchkine * 86562ee1d25SArtem Kachitchkine * Note: this function currently lacks the ability to walk _all_ private 86662ee1d25SArtem Kachitchkine * properties if the link, because there is no kernel interface to 86762ee1d25SArtem Kachitchkine * retrieve all known private property names. Once such an interface 86862ee1d25SArtem Kachitchkine * is added, this function should be fixed accordingly. 869d62bc4baSyz147064 */ 870d62bc4baSyz147064 dladm_status_t 8714ac67f02SAnurag S. Maskey dladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg, 8724ac67f02SAnurag S. Maskey int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 8730ba2cbe9Sxc151355 { 874d62bc4baSyz147064 dladm_status_t status; 875d62bc4baSyz147064 datalink_class_t class; 876d62bc4baSyz147064 uint_t media; 877d62bc4baSyz147064 int i; 8780ba2cbe9Sxc151355 879d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || func == NULL) 880d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 8810ba2cbe9Sxc151355 8824ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 8834ac67f02SAnurag S. Maskey NULL, 0); 884d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 885d62bc4baSyz147064 return (status); 886d62bc4baSyz147064 88762ee1d25SArtem Kachitchkine /* public */ 888d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 889d62bc4baSyz147064 if (!(prop_table[i].pd_class & class)) 890d62bc4baSyz147064 continue; 891d62bc4baSyz147064 892d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media)) 893d62bc4baSyz147064 continue; 894d62bc4baSyz147064 8954ac67f02SAnurag S. Maskey if (func(handle, linkid, prop_table[i].pd_name, arg) == 896d62bc4baSyz147064 DLADM_WALK_TERMINATE) { 897d62bc4baSyz147064 break; 898d62bc4baSyz147064 } 899d62bc4baSyz147064 } 900d62bc4baSyz147064 90162ee1d25SArtem Kachitchkine /* private */ 90262ee1d25SArtem Kachitchkine status = i_dladm_walk_linkprop_priv_db(handle, linkid, arg, func); 90362ee1d25SArtem Kachitchkine 90462ee1d25SArtem Kachitchkine return (status); 905d62bc4baSyz147064 } 906d62bc4baSyz147064 907d62bc4baSyz147064 /* 908d62bc4baSyz147064 * Get linkprop of the given specific link. 909d62bc4baSyz147064 */ 910d62bc4baSyz147064 dladm_status_t 9114ac67f02SAnurag S. Maskey dladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid, 9124ac67f02SAnurag S. Maskey dladm_prop_type_t type, const char *prop_name, char **prop_val, 9134ac67f02SAnurag S. Maskey uint_t *val_cntp) 914d62bc4baSyz147064 { 915d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 916d62bc4baSyz147064 datalink_class_t class; 917d62bc4baSyz147064 uint_t media; 918d62bc4baSyz147064 prop_desc_t *pdp; 9194045d941Ssowmini uint_t cnt, dld_flags = 0; 920d62bc4baSyz147064 int i; 921afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 922d62bc4baSyz147064 9234045d941Ssowmini if (type == DLADM_PROP_VAL_DEFAULT) 924f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_DEFAULT; 925f0f2c3a5SGirish Moodalbail else if (type == DLADM_PROP_VAL_MODIFIABLE) 926f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_POSSIBLE; 9274045d941Ssowmini 928d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 929d62bc4baSyz147064 prop_val == NULL || val_cntp == NULL || *val_cntp == 0) 930d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 931d62bc4baSyz147064 932d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) 933d62bc4baSyz147064 if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) 934d62bc4baSyz147064 break; 935d62bc4baSyz147064 936e7801d59Ssowmini if (i == DLADM_MAX_PROPS) { 937e7801d59Ssowmini if (prop_name[0] == '_') { 938e7801d59Ssowmini /* 939e7801d59Ssowmini * private property. 940e7801d59Ssowmini */ 94162ee1d25SArtem Kachitchkine if (type == DLADM_PROP_VAL_PERSISTENT) 94262ee1d25SArtem Kachitchkine return (i_dladm_get_linkprop_db(handle, linkid, 94362ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp)); 94462ee1d25SArtem Kachitchkine else 94562ee1d25SArtem Kachitchkine return (i_dladm_get_priv_prop(handle, linkid, 94662ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp, type, 94762ee1d25SArtem Kachitchkine dld_flags)); 948e7801d59Ssowmini } else { 949d62bc4baSyz147064 return (DLADM_STATUS_NOTFOUND); 950e7801d59Ssowmini } 951e7801d59Ssowmini } 952d62bc4baSyz147064 953d62bc4baSyz147064 pdp = &prop_table[i]; 954d62bc4baSyz147064 9554ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 9564ac67f02SAnurag S. Maskey NULL, 0); 957d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 958d62bc4baSyz147064 return (status); 959d62bc4baSyz147064 960d62bc4baSyz147064 if (!(pdp->pd_class & class)) 961d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 962d62bc4baSyz147064 963d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 964d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 965d62bc4baSyz147064 966d62bc4baSyz147064 switch (type) { 967d62bc4baSyz147064 case DLADM_PROP_VAL_CURRENT: 9684ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 9694ac67f02SAnurag S. Maskey media, dld_flags, &perm_flags); 970afdda45fSVasumathi Sundaram - Sun Microsystems break; 971afdda45fSVasumathi Sundaram - Sun Microsystems 972afdda45fSVasumathi Sundaram - Sun Microsystems case DLADM_PROP_VAL_PERM: 973afdda45fSVasumathi Sundaram - Sun Microsystems if (pdp->pd_set == NULL) { 974afdda45fSVasumathi Sundaram - Sun Microsystems perm_flags = MAC_PROP_PERM_READ; 975afdda45fSVasumathi Sundaram - Sun Microsystems } else { 9764ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 9774ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 978afdda45fSVasumathi Sundaram - Sun Microsystems } 979afdda45fSVasumathi Sundaram - Sun Microsystems 980afdda45fSVasumathi Sundaram - Sun Microsystems *prop_val[0] = '\0'; 98163a6526dSMichael Lim *val_cntp = 1; 982da14cebeSEric Cheng if (status == DLADM_STATUS_OK) 983da14cebeSEric Cheng (void) dladm_perm2str(perm_flags, *prop_val); 984d62bc4baSyz147064 break; 985d62bc4baSyz147064 986d62bc4baSyz147064 case DLADM_PROP_VAL_DEFAULT: 98713a55820Sar224390 /* 98813a55820Sar224390 * If defaults are not defined for the property, 98913a55820Sar224390 * pd_defval.vd_name should be null. If the driver 99013a55820Sar224390 * has to be contacted for the value, vd_name should 99113a55820Sar224390 * be the empty string (""). Otherwise, dladm will 99213a55820Sar224390 * just print whatever is in the table. 99313a55820Sar224390 */ 994d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) { 995d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 996d62bc4baSyz147064 break; 997d62bc4baSyz147064 } 9984045d941Ssowmini 9994045d941Ssowmini if (strlen(pdp->pd_defval.vd_name) == 0) { 10004ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 10014ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 10024045d941Ssowmini } else { 1003d62bc4baSyz147064 (void) strcpy(*prop_val, pdp->pd_defval.vd_name); 10044045d941Ssowmini } 1005d62bc4baSyz147064 *val_cntp = 1; 1006d62bc4baSyz147064 break; 1007d62bc4baSyz147064 1008d62bc4baSyz147064 case DLADM_PROP_VAL_MODIFIABLE: 1009d62bc4baSyz147064 if (pdp->pd_getmod != NULL) { 10104ac67f02SAnurag S. Maskey status = pdp->pd_getmod(handle, pdp, linkid, prop_val, 1011afdda45fSVasumathi Sundaram - Sun Microsystems val_cntp, media, dld_flags, &perm_flags); 1012d62bc4baSyz147064 break; 1013d62bc4baSyz147064 } 1014d62bc4baSyz147064 cnt = pdp->pd_noptval; 1015d62bc4baSyz147064 if (cnt == 0) { 1016d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 1017d62bc4baSyz147064 } else if (cnt > *val_cntp) { 1018d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 1019d62bc4baSyz147064 } else { 1020d62bc4baSyz147064 for (i = 0; i < cnt; i++) { 1021d62bc4baSyz147064 (void) strcpy(prop_val[i], 1022d62bc4baSyz147064 pdp->pd_optval[i].vd_name); 1023d62bc4baSyz147064 } 1024d62bc4baSyz147064 *val_cntp = cnt; 1025d62bc4baSyz147064 } 1026d62bc4baSyz147064 break; 1027d62bc4baSyz147064 case DLADM_PROP_VAL_PERSISTENT: 1028d62bc4baSyz147064 if (pdp->pd_flags & PD_TEMPONLY) 1029d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 10304ac67f02SAnurag S. Maskey status = i_dladm_get_linkprop_db(handle, linkid, prop_name, 1031d62bc4baSyz147064 prop_val, val_cntp); 1032d62bc4baSyz147064 break; 1033d62bc4baSyz147064 default: 1034d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 1035d62bc4baSyz147064 break; 1036d62bc4baSyz147064 } 1037d62bc4baSyz147064 1038d62bc4baSyz147064 return (status); 1039d62bc4baSyz147064 } 1040d62bc4baSyz147064 1041*4eaa4710SRishi Srivatsavai /* 1042*4eaa4710SRishi Srivatsavai * Get linkprop of the given specific link and run any possible conversion 1043*4eaa4710SRishi Srivatsavai * of the values using the check function for the property. Fails if the 1044*4eaa4710SRishi Srivatsavai * check function doesn't succeed for the property value. 1045*4eaa4710SRishi Srivatsavai */ 1046*4eaa4710SRishi Srivatsavai dladm_status_t 1047*4eaa4710SRishi Srivatsavai dladm_get_linkprop_values(dladm_handle_t handle, datalink_id_t linkid, 1048*4eaa4710SRishi Srivatsavai dladm_prop_type_t type, const char *prop_name, uint_t *ret_val, 1049*4eaa4710SRishi Srivatsavai uint_t *val_cntp) 1050*4eaa4710SRishi Srivatsavai { 1051*4eaa4710SRishi Srivatsavai dladm_status_t status; 1052*4eaa4710SRishi Srivatsavai datalink_class_t class; 1053*4eaa4710SRishi Srivatsavai uint_t media; 1054*4eaa4710SRishi Srivatsavai prop_desc_t *pdp; 1055*4eaa4710SRishi Srivatsavai uint_t dld_flags; 1056*4eaa4710SRishi Srivatsavai int valc, i; 1057*4eaa4710SRishi Srivatsavai char **prop_val; 1058*4eaa4710SRishi Srivatsavai uint_t perm_flags; 1059*4eaa4710SRishi Srivatsavai 1060*4eaa4710SRishi Srivatsavai if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 1061*4eaa4710SRishi Srivatsavai ret_val == NULL || val_cntp == NULL || *val_cntp == 0) 1062*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 1063*4eaa4710SRishi Srivatsavai 1064*4eaa4710SRishi Srivatsavai for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++) 1065*4eaa4710SRishi Srivatsavai if (strcasecmp(prop_name, pdp->pd_name) == 0) 1066*4eaa4710SRishi Srivatsavai break; 1067*4eaa4710SRishi Srivatsavai 1068*4eaa4710SRishi Srivatsavai if (pdp == prop_table + DLADM_MAX_PROPS) 1069*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTFOUND); 1070*4eaa4710SRishi Srivatsavai 1071*4eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_CHECK_ALLOC) 1072*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 1073*4eaa4710SRishi Srivatsavai 1074*4eaa4710SRishi Srivatsavai status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 1075*4eaa4710SRishi Srivatsavai NULL, 0); 1076*4eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 1077*4eaa4710SRishi Srivatsavai return (status); 1078*4eaa4710SRishi Srivatsavai 1079*4eaa4710SRishi Srivatsavai if (!(pdp->pd_class & class)) 1080*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 1081*4eaa4710SRishi Srivatsavai 1082*4eaa4710SRishi Srivatsavai if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 1083*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 1084*4eaa4710SRishi Srivatsavai 1085*4eaa4710SRishi Srivatsavai prop_val = malloc(*val_cntp * sizeof (*prop_val) + 1086*4eaa4710SRishi Srivatsavai *val_cntp * DLADM_PROP_VAL_MAX); 1087*4eaa4710SRishi Srivatsavai if (prop_val == NULL) 1088*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOMEM); 1089*4eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 1090*4eaa4710SRishi Srivatsavai prop_val[valc] = (char *)(prop_val + *val_cntp) + 1091*4eaa4710SRishi Srivatsavai valc * DLADM_PROP_VAL_MAX; 1092*4eaa4710SRishi Srivatsavai 1093*4eaa4710SRishi Srivatsavai dld_flags = (type == DLADM_PROP_VAL_DEFAULT) ? MAC_PROP_DEFAULT : 0; 1094*4eaa4710SRishi Srivatsavai 1095*4eaa4710SRishi Srivatsavai switch (type) { 1096*4eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_CURRENT: 1097*4eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 1098*4eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 1099*4eaa4710SRishi Srivatsavai break; 1100*4eaa4710SRishi Srivatsavai 1101*4eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_DEFAULT: 1102*4eaa4710SRishi Srivatsavai /* 1103*4eaa4710SRishi Srivatsavai * If defaults are not defined for the property, 1104*4eaa4710SRishi Srivatsavai * pd_defval.vd_name should be null. If the driver 1105*4eaa4710SRishi Srivatsavai * has to be contacted for the value, vd_name should 1106*4eaa4710SRishi Srivatsavai * be the empty string (""). Otherwise, dladm will 1107*4eaa4710SRishi Srivatsavai * just print whatever is in the table. 1108*4eaa4710SRishi Srivatsavai */ 1109*4eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name == NULL) { 1110*4eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOTSUP; 1111*4eaa4710SRishi Srivatsavai break; 1112*4eaa4710SRishi Srivatsavai } 1113*4eaa4710SRishi Srivatsavai 1114*4eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name[0] != '\0') { 1115*4eaa4710SRishi Srivatsavai *val_cntp = 1; 1116*4eaa4710SRishi Srivatsavai *ret_val = pdp->pd_defval.vd_val; 1117*4eaa4710SRishi Srivatsavai free(prop_val); 1118*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 1119*4eaa4710SRishi Srivatsavai } 1120*4eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 1121*4eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 1122*4eaa4710SRishi Srivatsavai break; 1123*4eaa4710SRishi Srivatsavai 1124*4eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_PERSISTENT: 1125*4eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_TEMPONLY) 1126*4eaa4710SRishi Srivatsavai status = DLADM_STATUS_TEMPONLY; 1127*4eaa4710SRishi Srivatsavai else 1128*4eaa4710SRishi Srivatsavai status = i_dladm_get_linkprop_db(handle, linkid, 1129*4eaa4710SRishi Srivatsavai prop_name, prop_val, val_cntp); 1130*4eaa4710SRishi Srivatsavai break; 1131*4eaa4710SRishi Srivatsavai 1132*4eaa4710SRishi Srivatsavai default: 1133*4eaa4710SRishi Srivatsavai status = DLADM_STATUS_BADARG; 1134*4eaa4710SRishi Srivatsavai break; 1135*4eaa4710SRishi Srivatsavai } 1136*4eaa4710SRishi Srivatsavai 1137*4eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 1138*4eaa4710SRishi Srivatsavai if (pdp->pd_check != NULL) { 1139*4eaa4710SRishi Srivatsavai val_desc_t *vdp; 1140*4eaa4710SRishi Srivatsavai 1141*4eaa4710SRishi Srivatsavai vdp = malloc(sizeof (val_desc_t) * *val_cntp); 1142*4eaa4710SRishi Srivatsavai if (vdp == NULL) 1143*4eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOMEM; 1144*4eaa4710SRishi Srivatsavai else 1145*4eaa4710SRishi Srivatsavai status = pdp->pd_check(handle, pdp, linkid, 1146*4eaa4710SRishi Srivatsavai prop_val, *val_cntp, vdp, media); 1147*4eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 1148*4eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 1149*4eaa4710SRishi Srivatsavai ret_val[valc] = vdp[valc].vd_val; 1150*4eaa4710SRishi Srivatsavai } 1151*4eaa4710SRishi Srivatsavai free(vdp); 1152*4eaa4710SRishi Srivatsavai } else { 1153*4eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) { 1154*4eaa4710SRishi Srivatsavai for (i = 0; i < pdp->pd_noptval; i++) { 1155*4eaa4710SRishi Srivatsavai if (strcmp(pdp->pd_optval[i].vd_name, 1156*4eaa4710SRishi Srivatsavai prop_val[valc]) == 0) { 1157*4eaa4710SRishi Srivatsavai ret_val[valc] = 1158*4eaa4710SRishi Srivatsavai pdp->pd_optval[i].vd_val; 1159*4eaa4710SRishi Srivatsavai break; 1160*4eaa4710SRishi Srivatsavai } 1161*4eaa4710SRishi Srivatsavai } 1162*4eaa4710SRishi Srivatsavai if (i == pdp->pd_noptval) { 1163*4eaa4710SRishi Srivatsavai status = DLADM_STATUS_FAILED; 1164*4eaa4710SRishi Srivatsavai break; 1165*4eaa4710SRishi Srivatsavai } 1166*4eaa4710SRishi Srivatsavai } 1167*4eaa4710SRishi Srivatsavai } 1168*4eaa4710SRishi Srivatsavai } 1169*4eaa4710SRishi Srivatsavai 1170*4eaa4710SRishi Srivatsavai free(prop_val); 1171*4eaa4710SRishi Srivatsavai 1172*4eaa4710SRishi Srivatsavai return (status); 1173*4eaa4710SRishi Srivatsavai } 1174*4eaa4710SRishi Srivatsavai 1175d62bc4baSyz147064 /*ARGSUSED*/ 1176d62bc4baSyz147064 static int 11774ac67f02SAnurag S. Maskey i_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid, 11784ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 1179d62bc4baSyz147064 { 1180d62bc4baSyz147064 char *buf, **propvals; 1181d62bc4baSyz147064 uint_t i, valcnt = DLADM_MAX_PROP_VALCNT; 1182d62bc4baSyz147064 1183d62bc4baSyz147064 if ((buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * 1184d62bc4baSyz147064 DLADM_MAX_PROP_VALCNT)) == NULL) { 1185d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1186d62bc4baSyz147064 } 1187d62bc4baSyz147064 1188d62bc4baSyz147064 propvals = (char **)(void *)buf; 1189d62bc4baSyz147064 for (i = 0; i < valcnt; i++) { 1190d62bc4baSyz147064 propvals[i] = buf + 1191d62bc4baSyz147064 sizeof (char *) * DLADM_MAX_PROP_VALCNT + 1192d62bc4baSyz147064 i * DLADM_PROP_VAL_MAX; 1193d62bc4baSyz147064 } 1194d62bc4baSyz147064 11954ac67f02SAnurag S. Maskey if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 11964ac67f02SAnurag S. Maskey prop_name, propvals, &valcnt) != DLADM_STATUS_OK) { 1197d62bc4baSyz147064 goto done; 1198d62bc4baSyz147064 } 1199d62bc4baSyz147064 12004ac67f02SAnurag S. Maskey (void) dladm_set_linkprop(handle, linkid, prop_name, propvals, valcnt, 1201d62bc4baSyz147064 DLADM_OPT_ACTIVE); 1202d62bc4baSyz147064 1203d62bc4baSyz147064 done: 1204d62bc4baSyz147064 if (buf != NULL) 1205d62bc4baSyz147064 free(buf); 1206d62bc4baSyz147064 1207d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1208d62bc4baSyz147064 } 1209d62bc4baSyz147064 1210d62bc4baSyz147064 /*ARGSUSED*/ 1211d62bc4baSyz147064 static int 12124ac67f02SAnurag S. Maskey i_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg) 1213d62bc4baSyz147064 { 1214da14cebeSEric Cheng datalink_class_t class; 1215da14cebeSEric Cheng dladm_status_t status; 1216da14cebeSEric Cheng 12174ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, 12184ac67f02SAnurag S. Maskey NULL, 0); 1219da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 1220da14cebeSEric Cheng return (DLADM_WALK_TERMINATE); 1221da14cebeSEric Cheng 1222da14cebeSEric Cheng if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0) 12234ac67f02SAnurag S. Maskey (void) dladm_init_linkprop(handle, linkid, B_TRUE); 1224da14cebeSEric Cheng 1225d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 12260ba2cbe9Sxc151355 } 12270ba2cbe9Sxc151355 12280ba2cbe9Sxc151355 dladm_status_t 12294ac67f02SAnurag S. Maskey dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, 12304ac67f02SAnurag S. Maskey boolean_t any_media) 12310ba2cbe9Sxc151355 { 123230890389Sartem datalink_media_t dmedia; 123330890389Sartem uint32_t media; 123430890389Sartem 123530890389Sartem dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI; 123630890389Sartem 1237d62bc4baSyz147064 if (linkid == DATALINK_ALL_LINKID) { 12384ac67f02SAnurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, 12394ac67f02SAnurag S. Maskey NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); 12404ac67f02SAnurag S. Maskey } else if (any_media || 12414ac67f02SAnurag S. Maskey ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL, 12424ac67f02SAnurag S. Maskey 0) == DLADM_STATUS_OK) && 124330890389Sartem DATALINK_MEDIA_ACCEPTED(dmedia, media))) { 12444ac67f02SAnurag S. Maskey (void) dladm_walk_linkprop(handle, linkid, NULL, 12454ac67f02SAnurag S. Maskey i_dladm_init_one_prop); 1246d62bc4baSyz147064 } 1247d62bc4baSyz147064 return (DLADM_STATUS_OK); 12480ba2cbe9Sxc151355 } 1249f4b3ec61Sdh155122 1250e7801d59Ssowmini /* ARGSUSED */ 1251f4b3ec61Sdh155122 static dladm_status_t 12524ac67f02SAnurag S. Maskey do_get_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1253da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1254da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1255f4b3ec61Sdh155122 { 1256d62bc4baSyz147064 char zone_name[ZONENAME_MAX]; 1257d62bc4baSyz147064 zoneid_t zid; 1258d62bc4baSyz147064 dladm_status_t status; 12593bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 12603bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1261f4b3ec61Sdh155122 12624045d941Ssowmini if (flags != 0) 12634045d941Ssowmini return (DLADM_STATUS_NOTSUP); 12644045d941Ssowmini 12654ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1266da14cebeSEric Cheng &status, perm_flags); 1267d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1268d62bc4baSyz147064 return (status); 1269d62bc4baSyz147064 12703bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 12713bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid, cp, sizeof (zid)); 12723bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 12733bc21d0aSAruna Ramakrishna - Sun Microsystems 1274d62bc4baSyz147064 *val_cnt = 1; 1275d62bc4baSyz147064 if (zid != GLOBAL_ZONEID) { 1276afdda45fSVasumathi Sundaram - Sun Microsystems if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) { 1277f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1278afdda45fSVasumathi Sundaram - Sun Microsystems } 1279f4b3ec61Sdh155122 1280d62bc4baSyz147064 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX); 128147a01978Sbw } else { 1282d62bc4baSyz147064 *prop_val[0] = '\0'; 128347a01978Sbw } 1284f4b3ec61Sdh155122 1285f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1286f4b3ec61Sdh155122 } 1287f4b3ec61Sdh155122 1288f4b3ec61Sdh155122 typedef int (*zone_get_devroot_t)(char *, char *, size_t); 1289f4b3ec61Sdh155122 1290f4b3ec61Sdh155122 static int 1291f4b3ec61Sdh155122 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen) 1292f4b3ec61Sdh155122 { 1293f4b3ec61Sdh155122 char root[MAXPATHLEN]; 1294f4b3ec61Sdh155122 zone_get_devroot_t real_zone_get_devroot; 1295f4b3ec61Sdh155122 void *dlhandle; 1296f4b3ec61Sdh155122 void *sym; 1297f4b3ec61Sdh155122 int ret; 1298f4b3ec61Sdh155122 1299f4b3ec61Sdh155122 if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL) 1300f4b3ec61Sdh155122 return (-1); 1301f4b3ec61Sdh155122 1302f4b3ec61Sdh155122 if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) { 1303f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1304f4b3ec61Sdh155122 return (-1); 1305f4b3ec61Sdh155122 } 1306f4b3ec61Sdh155122 1307f4b3ec61Sdh155122 real_zone_get_devroot = (zone_get_devroot_t)sym; 1308f4b3ec61Sdh155122 1309f4b3ec61Sdh155122 if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0) 1310f4b3ec61Sdh155122 (void) snprintf(dev, devlen, "%s%s", root, "/dev"); 1311f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1312f4b3ec61Sdh155122 return (ret); 1313f4b3ec61Sdh155122 } 1314f4b3ec61Sdh155122 1315f4b3ec61Sdh155122 static dladm_status_t 13164ac67f02SAnurag S. Maskey i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid, 13174ac67f02SAnurag S. Maskey datalink_id_t linkid, boolean_t add) 1318f4b3ec61Sdh155122 { 1319f4b3ec61Sdh155122 char path[MAXPATHLEN]; 1320d62bc4baSyz147064 char name[MAXLINKNAMELEN]; 1321f4b3ec61Sdh155122 di_prof_t prof = NULL; 1322f4b3ec61Sdh155122 char zone_name[ZONENAME_MAX]; 1323f4b3ec61Sdh155122 dladm_status_t status; 1324d62bc4baSyz147064 int ret; 1325f4b3ec61Sdh155122 1326f4b3ec61Sdh155122 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) 1327f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1328f4b3ec61Sdh155122 if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0) 1329f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1330f4b3ec61Sdh155122 if (di_prof_init(path, &prof) != 0) 1331f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1332f4b3ec61Sdh155122 13334ac67f02SAnurag S. Maskey status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN); 1334f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1335d62bc4baSyz147064 goto cleanup; 1336f4b3ec61Sdh155122 1337d62bc4baSyz147064 if (add) 1338d62bc4baSyz147064 ret = di_prof_add_dev(prof, name); 1339d62bc4baSyz147064 else 1340d62bc4baSyz147064 ret = di_prof_add_exclude(prof, name); 1341f4b3ec61Sdh155122 1342d62bc4baSyz147064 if (ret != 0) { 1343d62bc4baSyz147064 status = dladm_errno2status(errno); 1344d62bc4baSyz147064 goto cleanup; 1345f4b3ec61Sdh155122 } 1346f4b3ec61Sdh155122 1347d62bc4baSyz147064 if (di_prof_commit(prof) != 0) 1348d62bc4baSyz147064 status = dladm_errno2status(errno); 1349d62bc4baSyz147064 cleanup: 1350d62bc4baSyz147064 if (prof) 1351d62bc4baSyz147064 di_prof_fini(prof); 1352d62bc4baSyz147064 1353d62bc4baSyz147064 return (status); 1354f4b3ec61Sdh155122 } 1355f4b3ec61Sdh155122 1356e7801d59Ssowmini /* ARGSUSED */ 1357f4b3ec61Sdh155122 static dladm_status_t 13584ac67f02SAnurag S. Maskey do_set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 13594ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1360f4b3ec61Sdh155122 { 13613bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 1362f4b3ec61Sdh155122 zoneid_t zid_old, zid_new; 1363d62bc4baSyz147064 char link[MAXLINKNAMELEN]; 13643bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 13653bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 13663bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1367f4b3ec61Sdh155122 1368f4b3ec61Sdh155122 if (val_cnt != 1) 1369f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1370f4b3ec61Sdh155122 13713bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = (dld_ioc_zid_t *)vdp->vd_val; 13723bc21d0aSAruna Ramakrishna - Sun Microsystems 13734ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1374da14cebeSEric Cheng &status, NULL); 1375f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1376f4b3ec61Sdh155122 return (status); 1377f4b3ec61Sdh155122 13783bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 13793bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid_old, cp, sizeof (zid_old)); 13803bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1381f4b3ec61Sdh155122 13823bc21d0aSAruna Ramakrishna - Sun Microsystems zid_new = dzp->diz_zid; 13833bc21d0aSAruna Ramakrishna - Sun Microsystems (void) strlcpy(link, dzp->diz_link, MAXLINKNAMELEN); 13843bc21d0aSAruna Ramakrishna - Sun Microsystems 13853bc21d0aSAruna Ramakrishna - Sun Microsystems /* Do nothing if setting to current value */ 13863bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new == zid_old) 13873bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 13883bc21d0aSAruna Ramakrishna - Sun Microsystems 1389d62bc4baSyz147064 if (zid_new != GLOBAL_ZONEID) { 1390d62bc4baSyz147064 /* 1391d62bc4baSyz147064 * If the new zoneid is the global zone, we could destroy 1392d62bc4baSyz147064 * the link (in the case of an implicitly-created VLAN) as a 13933bc21d0aSAruna Ramakrishna - Sun Microsystems * result of setting the zoneid. In that case, we defer the 13943bc21d0aSAruna Ramakrishna - Sun Microsystems * operation to the end of this function to avoid recreating 13953bc21d0aSAruna Ramakrishna - Sun Microsystems * the VLAN and getting a different linkid during the rollback 13963bc21d0aSAruna Ramakrishna - Sun Microsystems * if other operation fails. 1397d62bc4baSyz147064 * 13983bc21d0aSAruna Ramakrishna - Sun Microsystems * Otherwise, this operation will hold a reference to the 1399d62bc4baSyz147064 * link and prevent a link renaming, so we need to do it 1400d62bc4baSyz147064 * before other operations. 1401d62bc4baSyz147064 */ 14024ac67f02SAnurag S. Maskey status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, 14034ac67f02SAnurag S. Maskey val_cnt, flags, media); 1404d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1405d62bc4baSyz147064 return (status); 1406d62bc4baSyz147064 } 1407d62bc4baSyz147064 1408d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) { 1409d62bc4baSyz147064 if (zone_remove_datalink(zid_old, link) != 0 && 1410f4b3ec61Sdh155122 errno != ENXIO) { 1411f4b3ec61Sdh155122 status = dladm_errno2status(errno); 1412f4b3ec61Sdh155122 goto rollback1; 1413f4b3ec61Sdh155122 } 1414f4b3ec61Sdh155122 1415d62bc4baSyz147064 /* 1416d62bc4baSyz147064 * It is okay to fail to update the /dev entry (some 1417d62bc4baSyz147064 * vanity-named links do not have a /dev entry). 1418d62bc4baSyz147064 */ 14194ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, 14204ac67f02SAnurag S. Maskey B_FALSE); 1421d62bc4baSyz147064 } 1422d62bc4baSyz147064 1423d62bc4baSyz147064 if (zid_new != GLOBAL_ZONEID) { 1424d62bc4baSyz147064 if (zone_add_datalink(zid_new, link) != 0) { 1425d62bc4baSyz147064 status = dladm_errno2status(errno); 1426d62bc4baSyz147064 goto rollback2; 1427d62bc4baSyz147064 } 1428d62bc4baSyz147064 14294ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE); 1430d62bc4baSyz147064 } else { 14314ac67f02SAnurag S. Maskey status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, 14324ac67f02SAnurag S. Maskey val_cnt, flags, media); 1433f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1434f4b3ec61Sdh155122 goto rollback2; 1435f4b3ec61Sdh155122 } 1436f4b3ec61Sdh155122 1437f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1438f4b3ec61Sdh155122 1439f4b3ec61Sdh155122 rollback2: 1440f4b3ec61Sdh155122 if (zid_old != GLOBAL_ZONEID) 14414ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, B_TRUE); 1442d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) 1443d62bc4baSyz147064 (void) zone_add_datalink(zid_old, link); 1444f4b3ec61Sdh155122 rollback1: 14453bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new != GLOBAL_ZONEID) { 14463bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zid_old; 14474ac67f02SAnurag S. Maskey (void) i_dladm_set_public_prop(handle, pdp, linkid, vdp, 14484ac67f02SAnurag S. Maskey val_cnt, flags, media); 14493bc21d0aSAruna Ramakrishna - Sun Microsystems } 14503bc21d0aSAruna Ramakrishna - Sun Microsystems 1451f4b3ec61Sdh155122 return (status); 1452f4b3ec61Sdh155122 } 1453f4b3ec61Sdh155122 1454f4b3ec61Sdh155122 /* ARGSUSED */ 1455f4b3ec61Sdh155122 static dladm_status_t 14564ac67f02SAnurag S. Maskey do_check_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14574ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1458f4b3ec61Sdh155122 { 14593bc21d0aSAruna Ramakrishna - Sun Microsystems char *zone_name; 14603bc21d0aSAruna Ramakrishna - Sun Microsystems char linkname[MAXLINKNAMELEN]; 14613bc21d0aSAruna Ramakrishna - Sun Microsystems zoneid_t zoneid; 14623bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 14633bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1464f4b3ec61Sdh155122 1465f4b3ec61Sdh155122 if (val_cnt != 1) 1466f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1467f4b3ec61Sdh155122 14683bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = malloc(sizeof (dld_ioc_zid_t)); 14693bc21d0aSAruna Ramakrishna - Sun Microsystems if (dzp == NULL) 14703bc21d0aSAruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM); 1471f4b3ec61Sdh155122 14724ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, 14733bc21d0aSAruna Ramakrishna - Sun Microsystems linkname, MAXLINKNAMELEN)) != DLADM_STATUS_OK) { 14743bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 14753bc21d0aSAruna Ramakrishna - Sun Microsystems } 14763bc21d0aSAruna Ramakrishna - Sun Microsystems 1477da14cebeSEric Cheng zone_name = (prop_val != NULL) ? *prop_val : GLOBAL_ZONENAME; 14783bc21d0aSAruna Ramakrishna - Sun Microsystems if (strlen(linkname) > MAXLINKNAMELEN) { 14793bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14803bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 14813bc21d0aSAruna Ramakrishna - Sun Microsystems } 14823bc21d0aSAruna Ramakrishna - Sun Microsystems 14833bc21d0aSAruna Ramakrishna - Sun Microsystems if ((zoneid = getzoneidbyname(zone_name)) == -1) { 14843bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14853bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 14863bc21d0aSAruna Ramakrishna - Sun Microsystems } 14873bc21d0aSAruna Ramakrishna - Sun Microsystems 14883bc21d0aSAruna Ramakrishna - Sun Microsystems if (zoneid != GLOBAL_ZONEID) { 1489f4b3ec61Sdh155122 ushort_t flags; 1490f4b3ec61Sdh155122 14913bc21d0aSAruna Ramakrishna - Sun Microsystems if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &flags, 1492f4b3ec61Sdh155122 sizeof (flags)) < 0) { 14933bc21d0aSAruna Ramakrishna - Sun Microsystems status = dladm_errno2status(errno); 14943bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1495f4b3ec61Sdh155122 } 1496f4b3ec61Sdh155122 1497f4b3ec61Sdh155122 if (!(flags & ZF_NET_EXCL)) { 14983bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14993bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1500f4b3ec61Sdh155122 } 1501f4b3ec61Sdh155122 } 1502f4b3ec61Sdh155122 15033bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memset(dzp, 0, sizeof (dld_ioc_zid_t)); 15043bc21d0aSAruna Ramakrishna - Sun Microsystems 15053bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zoneid; 15063bc21d0aSAruna Ramakrishna - Sun Microsystems (void) strlcpy(dzp->diz_link, linkname, MAXLINKNAMELEN); 15073bc21d0aSAruna Ramakrishna - Sun Microsystems 15083bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dzp; 1509f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 15103bc21d0aSAruna Ramakrishna - Sun Microsystems done: 15113bc21d0aSAruna Ramakrishna - Sun Microsystems free(dzp); 15123bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 1513f4b3ec61Sdh155122 } 1514f4b3ec61Sdh155122 1515e7801d59Ssowmini /* ARGSUSED */ 1516f4b3ec61Sdh155122 static dladm_status_t 151762ee1d25SArtem Kachitchkine i_dladm_maxbw_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1518da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1519da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1520da14cebeSEric Cheng { 1521da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1522da14cebeSEric Cheng mac_resource_props_t mrp; 1523da14cebeSEric Cheng dladm_status_t status; 1524da14cebeSEric Cheng 15254ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1526da14cebeSEric Cheng &status, perm_flags); 1527da14cebeSEric Cheng if (dip == NULL) 1528da14cebeSEric Cheng return (status); 1529da14cebeSEric Cheng 1530da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1531da14cebeSEric Cheng free(dip); 1532da14cebeSEric Cheng 1533da14cebeSEric Cheng if ((mrp.mrp_mask & MRP_MAXBW) == 0) { 1534da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1535da14cebeSEric Cheng } else { 1536da14cebeSEric Cheng (void) dladm_bw2str(mrp.mrp_maxbw, prop_val[0]); 1537da14cebeSEric Cheng } 1538da14cebeSEric Cheng *val_cnt = 1; 1539da14cebeSEric Cheng return (DLADM_STATUS_OK); 1540da14cebeSEric Cheng } 1541da14cebeSEric Cheng 1542da14cebeSEric Cheng /* ARGSUSED */ 1543da14cebeSEric Cheng static dladm_status_t 15444ac67f02SAnurag S. Maskey do_check_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 15454ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1546da14cebeSEric Cheng { 1547da14cebeSEric Cheng uint64_t *maxbw; 1548da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1549da14cebeSEric Cheng 1550da14cebeSEric Cheng if (val_cnt != 1) 1551da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1552da14cebeSEric Cheng 1553da14cebeSEric Cheng maxbw = malloc(sizeof (uint64_t)); 1554da14cebeSEric Cheng if (maxbw == NULL) 1555da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1556da14cebeSEric Cheng 1557da14cebeSEric Cheng status = dladm_str2bw(*prop_val, maxbw); 1558da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1559da14cebeSEric Cheng free(maxbw); 1560da14cebeSEric Cheng return (status); 1561da14cebeSEric Cheng } 1562da14cebeSEric Cheng 1563da14cebeSEric Cheng if ((*maxbw < MRP_MAXBW_MINVAL) && (*maxbw != 0)) { 1564da14cebeSEric Cheng free(maxbw); 1565da14cebeSEric Cheng return (DLADM_STATUS_MINMAXBW); 1566da14cebeSEric Cheng } 1567da14cebeSEric Cheng 1568da14cebeSEric Cheng vdp->vd_val = (uintptr_t)maxbw; 1569da14cebeSEric Cheng return (DLADM_STATUS_OK); 1570da14cebeSEric Cheng } 1571da14cebeSEric Cheng 1572da14cebeSEric Cheng /* ARGSUSED */ 1573da14cebeSEric Cheng dladm_status_t 1574da14cebeSEric Cheng do_extract_maxbw(val_desc_t *vdp, void *arg, uint_t cnt) 1575da14cebeSEric Cheng { 1576da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1577da14cebeSEric Cheng 1578da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_maxbw, sizeof (uint64_t)); 1579da14cebeSEric Cheng mrp->mrp_mask |= MRP_MAXBW; 1580da14cebeSEric Cheng 1581da14cebeSEric Cheng return (DLADM_STATUS_OK); 1582da14cebeSEric Cheng } 1583da14cebeSEric Cheng 1584da14cebeSEric Cheng /* ARGSUSED */ 1585da14cebeSEric Cheng static dladm_status_t 158662ee1d25SArtem Kachitchkine i_dladm_cpus_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1587da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1588da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1589da14cebeSEric Cheng { 1590da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1591da14cebeSEric Cheng mac_resource_props_t mrp; 1592da14cebeSEric Cheng int i; 1593da14cebeSEric Cheng uint32_t ncpus; 1594da14cebeSEric Cheng uchar_t *cp; 1595da14cebeSEric Cheng dladm_status_t status; 1596da14cebeSEric Cheng 15974ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1598da14cebeSEric Cheng &status, perm_flags); 1599da14cebeSEric Cheng if (dip == NULL) 1600da14cebeSEric Cheng return (status); 1601da14cebeSEric Cheng 1602da14cebeSEric Cheng cp = (uchar_t *)dip->pr_val; 1603da14cebeSEric Cheng (void) memcpy(&mrp, cp, sizeof (mac_resource_props_t)); 1604da14cebeSEric Cheng free(dip); 1605da14cebeSEric Cheng 1606da14cebeSEric Cheng ncpus = mrp.mrp_ncpus; 1607da14cebeSEric Cheng 1608da14cebeSEric Cheng if (ncpus > *val_cnt) 1609da14cebeSEric Cheng return (DLADM_STATUS_TOOSMALL); 1610da14cebeSEric Cheng 1611da14cebeSEric Cheng if (ncpus == 0) { 1612da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1613da14cebeSEric Cheng *val_cnt = 1; 1614da14cebeSEric Cheng return (DLADM_STATUS_OK); 1615da14cebeSEric Cheng } 1616da14cebeSEric Cheng 1617da14cebeSEric Cheng *val_cnt = ncpus; 1618da14cebeSEric Cheng for (i = 0; i < ncpus; i++) { 1619da14cebeSEric Cheng (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 1620da14cebeSEric Cheng "%u", mrp.mrp_cpu[i]); 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_set_res(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16284ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1629da14cebeSEric Cheng { 1630da14cebeSEric Cheng mac_resource_props_t mrp; 1631da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1632da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1633da14cebeSEric Cheng 1634da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1635da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1636da14cebeSEric Cheng flags, &status); 1637da14cebeSEric Cheng 1638da14cebeSEric Cheng if (dip == NULL) 1639da14cebeSEric Cheng return (status); 1640da14cebeSEric Cheng 1641da14cebeSEric Cheng if (vdp->vd_val == RESET_VAL) { 1642da14cebeSEric Cheng switch (dip->pr_num) { 1643da14cebeSEric Cheng case MAC_PROP_MAXBW: 1644da14cebeSEric Cheng mrp.mrp_maxbw = MRP_MAXBW_RESETVAL; 1645da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1646da14cebeSEric Cheng break; 1647da14cebeSEric Cheng case MAC_PROP_PRIO: 1648da14cebeSEric Cheng mrp.mrp_priority = MPL_RESET; 1649da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1650da14cebeSEric Cheng break; 1651da14cebeSEric Cheng default: 1652da14cebeSEric Cheng free(dip); 1653da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1654da14cebeSEric Cheng } 1655da14cebeSEric Cheng } else { 1656da14cebeSEric Cheng switch (dip->pr_num) { 1657da14cebeSEric Cheng case MAC_PROP_MAXBW: 1658da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_maxbw, 1659da14cebeSEric Cheng sizeof (uint64_t)); 1660da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1661da14cebeSEric Cheng break; 1662da14cebeSEric Cheng case MAC_PROP_PRIO: 1663da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_priority, 1664da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1665da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1666da14cebeSEric Cheng break; 1667da14cebeSEric Cheng default: 1668da14cebeSEric Cheng free(dip); 1669da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1670da14cebeSEric Cheng } 1671da14cebeSEric Cheng } 1672da14cebeSEric Cheng 1673da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 16744ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1675da14cebeSEric Cheng free(dip); 1676da14cebeSEric Cheng return (status); 1677da14cebeSEric Cheng } 1678da14cebeSEric Cheng 1679da14cebeSEric Cheng /* ARGSUSED */ 1680da14cebeSEric Cheng static dladm_status_t 16814ac67f02SAnurag S. Maskey do_set_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16824ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1683da14cebeSEric Cheng { 1684da14cebeSEric Cheng mac_resource_props_t mrp; 1685da14cebeSEric Cheng dladm_status_t status; 1686da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1687da14cebeSEric Cheng datalink_class_t class; 1688da14cebeSEric Cheng 1689da14cebeSEric Cheng /* 1690da14cebeSEric Cheng * CPU bindings can be set on VNIC and regular physical links. 1691da14cebeSEric Cheng * However VNICs fails the dladm_phys_info test(). So apply 1692da14cebeSEric Cheng * the phys_info test only on physical links. 1693da14cebeSEric Cheng */ 16944ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, 1695da14cebeSEric Cheng NULL, NULL, 0)) != DLADM_STATUS_OK) { 1696da14cebeSEric Cheng return (status); 1697da14cebeSEric Cheng } 1698da14cebeSEric Cheng 1699da14cebeSEric Cheng /* 1700da14cebeSEric Cheng * We set intr_cpu to -1. The interrupt will be retargetted, 1701da14cebeSEric Cheng * if possible when the setup is complete in MAC. 1702da14cebeSEric Cheng */ 1703da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1704da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1705da14cebeSEric Cheng if (vdp != NULL && vdp->vd_val != RESET_VAL) { 1706da14cebeSEric Cheng mac_resource_props_t *vmrp; 1707da14cebeSEric Cheng 1708da14cebeSEric Cheng vmrp = (mac_resource_props_t *)vdp->vd_val; 1709da14cebeSEric Cheng if (vmrp->mrp_ncpus > 0) { 1710da14cebeSEric Cheng bcopy(vmrp, &mrp, sizeof (mac_resource_props_t)); 1711da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1712da14cebeSEric Cheng } 1713da14cebeSEric Cheng mrp.mrp_mask |= MRP_CPUS_USERSPEC; 1714da14cebeSEric Cheng mrp.mrp_fanout_mode = MCM_CPUS; 1715da14cebeSEric Cheng mrp.mrp_intr_cpu = -1; 1716da14cebeSEric Cheng } 1717da14cebeSEric Cheng 1718da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1719da14cebeSEric Cheng flags, &status); 1720da14cebeSEric Cheng if (dip == NULL) 1721da14cebeSEric Cheng return (status); 1722da14cebeSEric Cheng 1723da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 17244ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1725da14cebeSEric Cheng free(dip); 1726da14cebeSEric Cheng return (status); 1727da14cebeSEric Cheng } 1728da14cebeSEric Cheng 1729da14cebeSEric Cheng /* ARGSUSED */ 1730da14cebeSEric Cheng static dladm_status_t 17314ac67f02SAnurag S. Maskey do_check_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 17324ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1733da14cebeSEric Cheng { 1734da14cebeSEric Cheng uint32_t cpuid; 1735da14cebeSEric Cheng int i, j, rc; 1736da14cebeSEric Cheng long nproc = sysconf(_SC_NPROCESSORS_CONF); 1737da14cebeSEric Cheng mac_resource_props_t *mrp; 1738da14cebeSEric Cheng 1739da14cebeSEric Cheng mrp = malloc(sizeof (mac_resource_props_t)); 1740da14cebeSEric Cheng if (mrp == NULL) 1741da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1742da14cebeSEric Cheng 1743da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1744da14cebeSEric Cheng errno = 0; 1745da14cebeSEric Cheng cpuid = strtol(prop_val[i], (char **)NULL, 10); 1746da14cebeSEric Cheng if (errno != 0 || cpuid >= nproc) { 1747da14cebeSEric Cheng free(mrp); 1748da14cebeSEric Cheng return (DLADM_STATUS_CPUMAX); 1749da14cebeSEric Cheng } 1750da14cebeSEric Cheng rc = p_online(cpuid, P_STATUS); 1751da14cebeSEric Cheng if (rc < 1) { 1752da14cebeSEric Cheng free(mrp); 1753da14cebeSEric Cheng return (DLADM_STATUS_CPUERR); 1754da14cebeSEric Cheng } 1755da14cebeSEric Cheng if (rc != P_ONLINE) { 1756da14cebeSEric Cheng free(mrp); 1757da14cebeSEric Cheng return (DLADM_STATUS_CPUNOTONLINE); 1758da14cebeSEric Cheng } 1759da14cebeSEric Cheng mrp->mrp_cpu[i] = cpuid; 1760da14cebeSEric Cheng } 1761da14cebeSEric Cheng mrp->mrp_ncpus = (uint32_t)val_cnt; 1762da14cebeSEric Cheng 1763da14cebeSEric Cheng /* Check for duplicates */ 1764da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1765da14cebeSEric Cheng for (j = 0; j < val_cnt; j++) { 1766da14cebeSEric Cheng if (i != j && mrp->mrp_cpu[i] == mrp->mrp_cpu[j]) { 1767da14cebeSEric Cheng free(mrp); 1768da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1769da14cebeSEric Cheng } 1770da14cebeSEric Cheng } 1771da14cebeSEric Cheng } 1772da14cebeSEric Cheng vdp->vd_val = (uintptr_t)mrp; 1773da14cebeSEric Cheng 1774da14cebeSEric Cheng return (DLADM_STATUS_OK); 1775da14cebeSEric Cheng } 1776da14cebeSEric Cheng 1777da14cebeSEric Cheng /* ARGSUSED */ 1778da14cebeSEric Cheng dladm_status_t 1779da14cebeSEric Cheng do_extract_cpus(val_desc_t *vdp, void *arg, uint_t cnt) 1780da14cebeSEric Cheng { 1781da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1782da14cebeSEric Cheng mac_resource_props_t *vmrp = (mac_resource_props_t *)vdp->vd_val; 1783da14cebeSEric Cheng int i; 1784da14cebeSEric Cheng 1785da14cebeSEric Cheng for (i = 0; i < vmrp->mrp_ncpus; i++) { 1786da14cebeSEric Cheng mrp->mrp_cpu[i] = vmrp->mrp_cpu[i]; 1787da14cebeSEric Cheng } 1788da14cebeSEric Cheng mrp->mrp_ncpus = vmrp->mrp_ncpus; 1789da14cebeSEric Cheng mrp->mrp_mask |= (MRP_CPUS|MRP_CPUS_USERSPEC); 1790da14cebeSEric Cheng mrp->mrp_fanout_mode = MCM_CPUS; 179163a6526dSMichael Lim mrp->mrp_intr_cpu = -1; 1792da14cebeSEric Cheng 1793da14cebeSEric Cheng return (DLADM_STATUS_OK); 1794da14cebeSEric Cheng } 1795da14cebeSEric Cheng 1796da14cebeSEric Cheng /* ARGSUSED */ 1797da14cebeSEric Cheng static dladm_status_t 179862ee1d25SArtem Kachitchkine i_dladm_priority_get(dladm_handle_t handle, prop_desc_t *pdp, 179962ee1d25SArtem Kachitchkine datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 180062ee1d25SArtem Kachitchkine datalink_media_t media, uint_t flags, uint_t *perm_flags) 1801da14cebeSEric Cheng { 1802da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1803da14cebeSEric Cheng mac_resource_props_t mrp; 1804da14cebeSEric Cheng mac_priority_level_t pri; 1805da14cebeSEric Cheng dladm_status_t status; 1806da14cebeSEric Cheng 18074ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1808da14cebeSEric Cheng &status, perm_flags); 1809da14cebeSEric Cheng if (dip == NULL) 1810da14cebeSEric Cheng return (status); 1811da14cebeSEric Cheng 1812da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1813da14cebeSEric Cheng free(dip); 1814da14cebeSEric Cheng 1815da14cebeSEric Cheng pri = ((mrp.mrp_mask & MRP_PRIORITY) == 0) ? MPL_HIGH : 1816da14cebeSEric Cheng mrp.mrp_priority; 1817da14cebeSEric Cheng 1818da14cebeSEric Cheng (void) dladm_pri2str(pri, prop_val[0]); 1819da14cebeSEric Cheng *val_cnt = 1; 1820da14cebeSEric Cheng return (DLADM_STATUS_OK); 1821da14cebeSEric Cheng } 1822da14cebeSEric Cheng 1823da14cebeSEric Cheng /* ARGSUSED */ 1824da14cebeSEric Cheng static dladm_status_t 18254ac67f02SAnurag S. Maskey do_check_priority(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 18264ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1827da14cebeSEric Cheng { 1828da14cebeSEric Cheng mac_priority_level_t *pri; 1829da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1830da14cebeSEric Cheng 1831da14cebeSEric Cheng if (val_cnt != 1) 1832da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1833da14cebeSEric Cheng 1834da14cebeSEric Cheng pri = malloc(sizeof (mac_priority_level_t)); 1835da14cebeSEric Cheng if (pri == NULL) 1836da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1837da14cebeSEric Cheng 1838da14cebeSEric Cheng status = dladm_str2pri(*prop_val, pri); 1839da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1840da14cebeSEric Cheng free(pri); 1841da14cebeSEric Cheng return (status); 1842da14cebeSEric Cheng } 1843da14cebeSEric Cheng 1844da14cebeSEric Cheng if (*pri < MPL_LOW || *pri > MPL_HIGH) { 1845da14cebeSEric Cheng free(pri); 1846da14cebeSEric Cheng return (DLADM_STATUS_BADVAL); 1847da14cebeSEric Cheng } 1848da14cebeSEric Cheng 1849da14cebeSEric Cheng vdp->vd_val = (uintptr_t)pri; 1850da14cebeSEric Cheng return (DLADM_STATUS_OK); 1851da14cebeSEric Cheng } 1852da14cebeSEric Cheng 1853da14cebeSEric Cheng /* ARGSUSED */ 1854da14cebeSEric Cheng dladm_status_t 1855da14cebeSEric Cheng do_extract_priority(val_desc_t *vdp, void *arg, uint_t cnt) 1856da14cebeSEric Cheng { 1857da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1858da14cebeSEric Cheng 1859da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_priority, 1860da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1861da14cebeSEric Cheng mrp->mrp_mask |= MRP_PRIORITY; 1862da14cebeSEric Cheng 1863da14cebeSEric Cheng return (DLADM_STATUS_OK); 1864da14cebeSEric Cheng } 1865da14cebeSEric Cheng 1866da14cebeSEric Cheng /* ARGSUSED */ 1867da14cebeSEric Cheng static dladm_status_t 18684ac67f02SAnurag S. Maskey do_get_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1869da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1870da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1871d62bc4baSyz147064 { 18723bc21d0aSAruna Ramakrishna - Sun Microsystems struct dlautopush dlap; 18733bc21d0aSAruna Ramakrishna - Sun Microsystems int i, len; 18743bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status; 18753bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1876d62bc4baSyz147064 18773fd94f8cSam223141 if (flags & MAC_PROP_DEFAULT) 1878149b7eb2SSowmini Varadhan return (DLADM_STATUS_NOTDEFINED); 18794045d941Ssowmini 1880d62bc4baSyz147064 *val_cnt = 1; 18814ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1882da14cebeSEric Cheng &status, perm_flags); 18833bc21d0aSAruna Ramakrishna - Sun Microsystems if (dip == NULL) { 1884d62bc4baSyz147064 (*prop_val)[0] = '\0'; 1885da14cebeSEric Cheng return (DLADM_STATUS_OK); 1886d62bc4baSyz147064 } 18873bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&dlap, dip->pr_val, sizeof (dlap)); 1888d62bc4baSyz147064 18893bc21d0aSAruna Ramakrishna - Sun Microsystems for (i = 0, len = 0; i < dlap.dap_npush; i++) { 1890d62bc4baSyz147064 if (i != 0) { 1891d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1892d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c", AP_DELIMITER); 1893d62bc4baSyz147064 len += 1; 1894d62bc4baSyz147064 } 1895d62bc4baSyz147064 (void) snprintf(*prop_val + len, DLADM_PROP_VAL_MAX - len, 18963bc21d0aSAruna Ramakrishna - Sun Microsystems "%s", dlap.dap_aplist[i]); 18973bc21d0aSAruna Ramakrishna - Sun Microsystems len += strlen(dlap.dap_aplist[i]); 18983bc21d0aSAruna Ramakrishna - Sun Microsystems if (dlap.dap_anchor - 1 == i) { 1899d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1900d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c%s", AP_DELIMITER, 1901d62bc4baSyz147064 AP_ANCHOR); 1902d62bc4baSyz147064 len += (strlen(AP_ANCHOR) + 1); 1903d62bc4baSyz147064 } 1904d62bc4baSyz147064 } 19053bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1906d62bc4baSyz147064 done: 1907d62bc4baSyz147064 return (DLADM_STATUS_OK); 1908d62bc4baSyz147064 } 1909d62bc4baSyz147064 1910d62bc4baSyz147064 /* 1911d62bc4baSyz147064 * Add the specified module to the dlautopush structure; returns a 1912d62bc4baSyz147064 * DLADM_STATUS_* code. 1913d62bc4baSyz147064 */ 1914d62bc4baSyz147064 dladm_status_t 1915d62bc4baSyz147064 i_dladm_add_ap_module(const char *module, struct dlautopush *dlap) 1916d62bc4baSyz147064 { 1917d62bc4baSyz147064 if ((strlen(module) == 0) || (strlen(module) > FMNAMESZ)) 1918d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1919d62bc4baSyz147064 1920d62bc4baSyz147064 if (strncasecmp(module, AP_ANCHOR, strlen(AP_ANCHOR)) == 0) { 1921d62bc4baSyz147064 /* 1922d62bc4baSyz147064 * We don't allow multiple anchors, and the anchor must 1923d62bc4baSyz147064 * be after at least one module. 1924d62bc4baSyz147064 */ 1925d62bc4baSyz147064 if (dlap->dap_anchor != 0) 1926d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1927d62bc4baSyz147064 if (dlap->dap_npush == 0) 1928d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1929d62bc4baSyz147064 1930d62bc4baSyz147064 dlap->dap_anchor = dlap->dap_npush; 1931d62bc4baSyz147064 return (DLADM_STATUS_OK); 1932d62bc4baSyz147064 } 1933285e94f9SMichael Lim if (dlap->dap_npush >= MAXAPUSH) 1934d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1935d62bc4baSyz147064 1936d62bc4baSyz147064 (void) strlcpy(dlap->dap_aplist[dlap->dap_npush++], module, 1937d62bc4baSyz147064 FMNAMESZ + 1); 1938d62bc4baSyz147064 1939d62bc4baSyz147064 return (DLADM_STATUS_OK); 1940d62bc4baSyz147064 } 1941d62bc4baSyz147064 1942d62bc4baSyz147064 /* 1943d62bc4baSyz147064 * Currently, both '.' and ' '(space) can be used as the delimiters between 1944d62bc4baSyz147064 * autopush modules. The former is used in dladm set-linkprop, and the 1945d62bc4baSyz147064 * latter is used in the autopush(1M) file. 1946d62bc4baSyz147064 */ 1947d62bc4baSyz147064 /* ARGSUSED */ 1948d62bc4baSyz147064 static dladm_status_t 19494ac67f02SAnurag S. Maskey do_check_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 19504ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1951d62bc4baSyz147064 { 1952d62bc4baSyz147064 char *module; 1953d62bc4baSyz147064 struct dlautopush *dlap; 1954d62bc4baSyz147064 dladm_status_t status; 1955d62bc4baSyz147064 char val[DLADM_PROP_VAL_MAX]; 1956d62bc4baSyz147064 char delimiters[4]; 1957d62bc4baSyz147064 1958d62bc4baSyz147064 if (val_cnt != 1) 1959d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1960d62bc4baSyz147064 19613bc21d0aSAruna Ramakrishna - Sun Microsystems if (prop_val != NULL) { 1962d62bc4baSyz147064 dlap = malloc(sizeof (struct dlautopush)); 1963d62bc4baSyz147064 if (dlap == NULL) 1964d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 1965d62bc4baSyz147064 1966d62bc4baSyz147064 (void) memset(dlap, 0, sizeof (struct dlautopush)); 1967d62bc4baSyz147064 (void) snprintf(delimiters, 4, " %c\n", AP_DELIMITER); 1968d62bc4baSyz147064 bcopy(*prop_val, val, DLADM_PROP_VAL_MAX); 1969d62bc4baSyz147064 module = strtok(val, delimiters); 1970d62bc4baSyz147064 while (module != NULL) { 1971d62bc4baSyz147064 status = i_dladm_add_ap_module(module, dlap); 1972d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1973d62bc4baSyz147064 return (status); 1974d62bc4baSyz147064 module = strtok(NULL, delimiters); 1975d62bc4baSyz147064 } 1976d62bc4baSyz147064 1977d62bc4baSyz147064 vdp->vd_val = (uintptr_t)dlap; 19783bc21d0aSAruna Ramakrishna - Sun Microsystems } else { 19793bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = 0; 19803bc21d0aSAruna Ramakrishna - Sun Microsystems } 1981d62bc4baSyz147064 return (DLADM_STATUS_OK); 1982d62bc4baSyz147064 } 1983d62bc4baSyz147064 1984bcb5c89dSSowmini Varadhan #define WLDP_BUFSIZE (MAX_BUF_LEN - WIFI_BUF_OFFSET) 1985bcb5c89dSSowmini Varadhan 1986e7801d59Ssowmini /* ARGSUSED */ 1987d62bc4baSyz147064 static dladm_status_t 19884ac67f02SAnurag S. Maskey do_get_rate_common(dladm_handle_t handle, prop_desc_t *pdp, 19894ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id, 19904ac67f02SAnurag S. Maskey uint_t *perm_flags) 1991d62bc4baSyz147064 { 1992d62bc4baSyz147064 wl_rates_t *wrp; 1993d62bc4baSyz147064 uint_t i; 1994d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1995d62bc4baSyz147064 1996bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 1997bcb5c89dSSowmini Varadhan if (wrp == NULL) 1998bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 1999d62bc4baSyz147064 20004ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE, 20014ac67f02SAnurag S. Maskey B_FALSE); 2002d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2003d62bc4baSyz147064 goto done; 2004d62bc4baSyz147064 2005d62bc4baSyz147064 if (wrp->wl_rates_num > *val_cnt) { 2006d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2007d62bc4baSyz147064 goto done; 2008d62bc4baSyz147064 } 2009d62bc4baSyz147064 2010d62bc4baSyz147064 if (wrp->wl_rates_rates[0] == 0) { 2011d62bc4baSyz147064 prop_val[0][0] = '\0'; 2012d62bc4baSyz147064 *val_cnt = 1; 2013d62bc4baSyz147064 goto done; 2014d62bc4baSyz147064 } 2015d62bc4baSyz147064 2016d62bc4baSyz147064 for (i = 0; i < wrp->wl_rates_num; i++) { 2017d62bc4baSyz147064 (void) snprintf(prop_val[i], DLADM_STRSIZE, "%.*f", 2018d62bc4baSyz147064 wrp->wl_rates_rates[i] % 2, 2019d62bc4baSyz147064 (float)wrp->wl_rates_rates[i] / 2); 2020d62bc4baSyz147064 } 2021d62bc4baSyz147064 *val_cnt = wrp->wl_rates_num; 2022da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_RW; 2023d62bc4baSyz147064 2024d62bc4baSyz147064 done: 2025bcb5c89dSSowmini Varadhan free(wrp); 2026d62bc4baSyz147064 return (status); 2027d62bc4baSyz147064 } 2028d62bc4baSyz147064 2029d62bc4baSyz147064 static dladm_status_t 20304ac67f02SAnurag S. Maskey do_get_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2031da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2032da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2033d62bc4baSyz147064 { 2034afdda45fSVasumathi Sundaram - Sun Microsystems if (media != DL_WIFI) { 20354ac67f02SAnurag S. Maskey return (i_dladm_speed_get(handle, pdp, linkid, prop_val, 2036da14cebeSEric Cheng val_cnt, flags, perm_flags)); 2037afdda45fSVasumathi Sundaram - Sun Microsystems } 20386b9e797cSsowmini 20394ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, val_cnt, 2040da14cebeSEric Cheng MAC_PROP_WL_DESIRED_RATES, perm_flags)); 2041d62bc4baSyz147064 } 2042d62bc4baSyz147064 20434045d941Ssowmini /* ARGSUSED */ 2044d62bc4baSyz147064 static dladm_status_t 20454ac67f02SAnurag S. Maskey do_get_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2046da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2047da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2048d62bc4baSyz147064 { 20496b9e797cSsowmini switch (media) { 20506b9e797cSsowmini case DL_ETHER: 20514045d941Ssowmini /* 20524045d941Ssowmini * Speed for ethernet links is unbounded. E.g., 802.11b 20534045d941Ssowmini * links can have a speed of 5.5 Gbps. 20544045d941Ssowmini */ 20554045d941Ssowmini return (DLADM_STATUS_NOTSUP); 20566b9e797cSsowmini 20576b9e797cSsowmini case DL_WIFI: 20584ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, 20594ac67f02SAnurag S. Maskey val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); 20606b9e797cSsowmini default: 20616b9e797cSsowmini return (DLADM_STATUS_BADARG); 20626b9e797cSsowmini } 2063d62bc4baSyz147064 } 2064d62bc4baSyz147064 2065d62bc4baSyz147064 static dladm_status_t 20664ac67f02SAnurag S. Maskey do_set_rate(dladm_handle_t handle, datalink_id_t linkid, 20674ac67f02SAnurag S. Maskey dladm_wlan_rates_t *rates) 2068f4b3ec61Sdh155122 { 2069f4b3ec61Sdh155122 int i; 2070d62bc4baSyz147064 uint_t len; 2071d62bc4baSyz147064 wl_rates_t *wrp; 2072d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2073d62bc4baSyz147064 2074bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 2075bcb5c89dSSowmini Varadhan if (wrp == NULL) 2076d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 2077d62bc4baSyz147064 2078bcb5c89dSSowmini Varadhan bzero(wrp, WLDP_BUFSIZE); 2079d62bc4baSyz147064 for (i = 0; i < rates->wr_cnt; i++) 2080d62bc4baSyz147064 wrp->wl_rates_rates[i] = rates->wr_rates[i]; 2081d62bc4baSyz147064 wrp->wl_rates_num = rates->wr_cnt; 2082d62bc4baSyz147064 2083d62bc4baSyz147064 len = offsetof(wl_rates_t, wl_rates_rates) + 2084d62bc4baSyz147064 (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; 20854ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, 20864ac67f02SAnurag S. Maskey MAC_PROP_WL_DESIRED_RATES, len, B_TRUE); 2087d62bc4baSyz147064 2088bcb5c89dSSowmini Varadhan free(wrp); 2089d62bc4baSyz147064 return (status); 2090d62bc4baSyz147064 } 2091d62bc4baSyz147064 2092e7801d59Ssowmini /* ARGSUSED */ 2093d62bc4baSyz147064 static dladm_status_t 20944ac67f02SAnurag S. Maskey do_set_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 20956b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 2096d62bc4baSyz147064 { 2097d62bc4baSyz147064 dladm_wlan_rates_t rates; 2098f4b3ec61Sdh155122 dladm_status_t status; 2099f4b3ec61Sdh155122 21006b9e797cSsowmini /* 21016b9e797cSsowmini * can currently set rate on WIFI links only. 21026b9e797cSsowmini */ 21036b9e797cSsowmini if (media != DL_WIFI) 21046b9e797cSsowmini return (DLADM_STATUS_PROPRDONLY); 21056b9e797cSsowmini 2106d62bc4baSyz147064 if (val_cnt != 1) 2107d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2108f4b3ec61Sdh155122 2109d62bc4baSyz147064 rates.wr_cnt = 1; 2110d62bc4baSyz147064 rates.wr_rates[0] = vdp[0].vd_val; 2111f4b3ec61Sdh155122 21124ac67f02SAnurag S. Maskey status = do_set_rate(handle, linkid, &rates); 2113f4b3ec61Sdh155122 2114d62bc4baSyz147064 done: 2115d62bc4baSyz147064 return (status); 2116d62bc4baSyz147064 } 2117d62bc4baSyz147064 2118d62bc4baSyz147064 /* ARGSUSED */ 2119d62bc4baSyz147064 static dladm_status_t 21204ac67f02SAnurag S. Maskey do_check_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 21214ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 2122d62bc4baSyz147064 { 2123d62bc4baSyz147064 int i; 2124d62bc4baSyz147064 uint_t modval_cnt = MAX_SUPPORT_RATES; 2125d62bc4baSyz147064 char *buf, **modval; 2126d62bc4baSyz147064 dladm_status_t status; 2127afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 2128d62bc4baSyz147064 2129d62bc4baSyz147064 if (val_cnt != 1) 2130d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2131d62bc4baSyz147064 2132d62bc4baSyz147064 buf = malloc((sizeof (char *) + DLADM_STRSIZE) * 2133d62bc4baSyz147064 MAX_SUPPORT_RATES); 2134d62bc4baSyz147064 if (buf == NULL) { 2135d62bc4baSyz147064 status = DLADM_STATUS_NOMEM; 2136d62bc4baSyz147064 goto done; 2137d62bc4baSyz147064 } 2138d62bc4baSyz147064 2139d62bc4baSyz147064 modval = (char **)(void *)buf; 2140d62bc4baSyz147064 for (i = 0; i < MAX_SUPPORT_RATES; i++) { 2141d62bc4baSyz147064 modval[i] = buf + sizeof (char *) * MAX_SUPPORT_RATES + 2142d62bc4baSyz147064 i * DLADM_STRSIZE; 2143d62bc4baSyz147064 } 2144d62bc4baSyz147064 21454ac67f02SAnurag S. Maskey status = do_get_rate_mod(handle, NULL, linkid, modval, &modval_cnt, 21464ac67f02SAnurag S. Maskey media, 0, &perm_flags); 2147d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2148d62bc4baSyz147064 goto done; 2149d62bc4baSyz147064 2150d62bc4baSyz147064 for (i = 0; i < modval_cnt; i++) { 2151d62bc4baSyz147064 if (strcasecmp(*prop_val, modval[i]) == 0) { 2152e7801d59Ssowmini vdp->vd_val = (uintptr_t)(uint_t) 2153e7801d59Ssowmini (atof(*prop_val) * 2); 2154f4b3ec61Sdh155122 status = DLADM_STATUS_OK; 2155f4b3ec61Sdh155122 break; 2156f4b3ec61Sdh155122 } 2157d62bc4baSyz147064 } 2158d62bc4baSyz147064 if (i == modval_cnt) 2159d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 2160d62bc4baSyz147064 done: 2161d62bc4baSyz147064 free(buf); 2162d62bc4baSyz147064 return (status); 2163d62bc4baSyz147064 } 2164f4b3ec61Sdh155122 2165d62bc4baSyz147064 static dladm_status_t 21664ac67f02SAnurag S. Maskey do_get_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf, 21674ac67f02SAnurag S. Maskey int buflen) 2168d62bc4baSyz147064 { 21694ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, 2170bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2171d62bc4baSyz147064 } 2172d62bc4baSyz147064 2173e7801d59Ssowmini /* ARGSUSED */ 2174d62bc4baSyz147064 static dladm_status_t 21754ac67f02SAnurag S. Maskey do_get_channel_prop(dladm_handle_t handle, prop_desc_t *pdp, 21764ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 21774ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2178d62bc4baSyz147064 { 2179d62bc4baSyz147064 uint32_t channel; 2180bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2181d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2182bcb5c89dSSowmini Varadhan wl_phy_conf_t wl_phy_conf; 2183d62bc4baSyz147064 21844ac67f02SAnurag S. Maskey if ((status = do_get_phyconf(handle, linkid, buf, sizeof (buf))) 2185bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2186d62bc4baSyz147064 goto done; 2187d62bc4baSyz147064 2188bcb5c89dSSowmini Varadhan (void) memcpy(&wl_phy_conf, buf, sizeof (wl_phy_conf)); 2189bcb5c89dSSowmini Varadhan if (!i_dladm_wlan_convert_chan(&wl_phy_conf, &channel)) { 2190d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2191d62bc4baSyz147064 goto done; 2192d62bc4baSyz147064 } 2193d62bc4baSyz147064 2194d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel); 2195d62bc4baSyz147064 *val_cnt = 1; 2196da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2197d62bc4baSyz147064 done: 2198d62bc4baSyz147064 return (status); 2199d62bc4baSyz147064 } 2200d62bc4baSyz147064 2201d62bc4baSyz147064 static dladm_status_t 22024ac67f02SAnurag S. Maskey do_get_powermode(dladm_handle_t handle, datalink_id_t linkid, void *buf, 22034ac67f02SAnurag S. Maskey int buflen) 2204d62bc4baSyz147064 { 22054ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_POWER_MODE, 2206bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2207d62bc4baSyz147064 } 2208d62bc4baSyz147064 2209e7801d59Ssowmini /* ARGSUSED */ 2210d62bc4baSyz147064 static dladm_status_t 22114ac67f02SAnurag S. Maskey do_get_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 22124ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 22134ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2214d62bc4baSyz147064 { 2215bcb5c89dSSowmini Varadhan wl_ps_mode_t mode; 2216d62bc4baSyz147064 const char *s; 2217bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2218d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2219d62bc4baSyz147064 22204ac67f02SAnurag S. Maskey if ((status = do_get_powermode(handle, linkid, buf, sizeof (buf))) 2221bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2222d62bc4baSyz147064 goto done; 2223d62bc4baSyz147064 2224bcb5c89dSSowmini Varadhan (void) memcpy(&mode, buf, sizeof (mode)); 2225bcb5c89dSSowmini Varadhan switch (mode.wl_ps_mode) { 2226d62bc4baSyz147064 case WL_PM_AM: 2227d62bc4baSyz147064 s = "off"; 2228f4b3ec61Sdh155122 break; 2229d62bc4baSyz147064 case WL_PM_MPS: 2230d62bc4baSyz147064 s = "max"; 2231d62bc4baSyz147064 break; 2232d62bc4baSyz147064 case WL_PM_FAST: 2233d62bc4baSyz147064 s = "fast"; 2234f4b3ec61Sdh155122 break; 2235f4b3ec61Sdh155122 default: 2236d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2237d62bc4baSyz147064 goto done; 2238f4b3ec61Sdh155122 } 2239d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2240d62bc4baSyz147064 *val_cnt = 1; 2241afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2242da14cebeSEric Cheng done: 2243d62bc4baSyz147064 return (status); 2244d62bc4baSyz147064 } 2245d62bc4baSyz147064 2246d62bc4baSyz147064 static dladm_status_t 22474ac67f02SAnurag S. Maskey do_set_powermode(dladm_handle_t handle, datalink_id_t linkid, 22484ac67f02SAnurag S. Maskey dladm_wlan_powermode_t *pm) 2249d62bc4baSyz147064 { 2250d62bc4baSyz147064 wl_ps_mode_t ps_mode; 2251d62bc4baSyz147064 2252d62bc4baSyz147064 (void) memset(&ps_mode, 0xff, sizeof (ps_mode)); 2253d62bc4baSyz147064 2254d62bc4baSyz147064 switch (*pm) { 2255d62bc4baSyz147064 case DLADM_WLAN_PM_OFF: 2256d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_AM; 2257d62bc4baSyz147064 break; 2258d62bc4baSyz147064 case DLADM_WLAN_PM_MAX: 2259d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_MPS; 2260d62bc4baSyz147064 break; 2261d62bc4baSyz147064 case DLADM_WLAN_PM_FAST: 2262d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_FAST; 2263d62bc4baSyz147064 break; 2264d62bc4baSyz147064 default: 2265d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2266d62bc4baSyz147064 } 22674ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &ps_mode, 22684ac67f02SAnurag S. Maskey MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE)); 2269d62bc4baSyz147064 } 2270d62bc4baSyz147064 2271d62bc4baSyz147064 /* ARGSUSED */ 2272d62bc4baSyz147064 static dladm_status_t 22734ac67f02SAnurag S. Maskey do_set_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 22744ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 22754ac67f02SAnurag S. Maskey datalink_media_t media) 2276d62bc4baSyz147064 { 2277d62bc4baSyz147064 dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; 2278d62bc4baSyz147064 dladm_status_t status; 2279d62bc4baSyz147064 2280d62bc4baSyz147064 if (val_cnt != 1) 2281d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2282d62bc4baSyz147064 22834ac67f02SAnurag S. Maskey status = do_set_powermode(handle, linkid, &powermode); 2284f4b3ec61Sdh155122 2285f4b3ec61Sdh155122 return (status); 2286f4b3ec61Sdh155122 } 2287f4b3ec61Sdh155122 2288f4b3ec61Sdh155122 static dladm_status_t 22894ac67f02SAnurag S. Maskey do_get_radio(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) 2290f4b3ec61Sdh155122 { 22914ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RADIO, 22924ac67f02SAnurag S. Maskey buflen, B_FALSE)); 2293d62bc4baSyz147064 } 2294d62bc4baSyz147064 2295e7801d59Ssowmini /* ARGSUSED */ 2296d62bc4baSyz147064 static dladm_status_t 22974ac67f02SAnurag S. Maskey do_get_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2298da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2299da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2300d62bc4baSyz147064 { 2301d62bc4baSyz147064 wl_radio_t radio; 2302d62bc4baSyz147064 const char *s; 2303bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2304d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2305d62bc4baSyz147064 23064ac67f02SAnurag S. Maskey if ((status = do_get_radio(handle, linkid, buf, sizeof (buf))) 2307bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2308d62bc4baSyz147064 goto done; 2309d62bc4baSyz147064 2310bcb5c89dSSowmini Varadhan (void) memcpy(&radio, buf, sizeof (radio)); 2311d62bc4baSyz147064 switch (radio) { 2312d62bc4baSyz147064 case B_TRUE: 2313d62bc4baSyz147064 s = "on"; 2314d62bc4baSyz147064 break; 2315d62bc4baSyz147064 case B_FALSE: 2316d62bc4baSyz147064 s = "off"; 2317d62bc4baSyz147064 break; 2318d62bc4baSyz147064 default: 2319d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2320d62bc4baSyz147064 goto done; 2321d62bc4baSyz147064 } 2322d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2323d62bc4baSyz147064 *val_cnt = 1; 2324afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2325da14cebeSEric Cheng done: 2326d62bc4baSyz147064 return (status); 2327d62bc4baSyz147064 } 2328d62bc4baSyz147064 2329d62bc4baSyz147064 static dladm_status_t 23304ac67f02SAnurag S. Maskey do_set_radio(dladm_handle_t handle, datalink_id_t linkid, 23314ac67f02SAnurag S. Maskey dladm_wlan_radio_t *radio) 2332d62bc4baSyz147064 { 2333d62bc4baSyz147064 wl_radio_t r; 2334d62bc4baSyz147064 2335d62bc4baSyz147064 switch (*radio) { 2336d62bc4baSyz147064 case DLADM_WLAN_RADIO_ON: 2337d62bc4baSyz147064 r = B_TRUE; 2338d62bc4baSyz147064 break; 2339d62bc4baSyz147064 case DLADM_WLAN_RADIO_OFF: 2340d62bc4baSyz147064 r = B_FALSE; 2341d62bc4baSyz147064 break; 2342d62bc4baSyz147064 default: 2343d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2344d62bc4baSyz147064 } 23454ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO, 2346bcb5c89dSSowmini Varadhan sizeof (r), B_TRUE)); 2347d62bc4baSyz147064 } 2348d62bc4baSyz147064 2349d62bc4baSyz147064 /* ARGSUSED */ 2350d62bc4baSyz147064 static dladm_status_t 23514ac67f02SAnurag S. Maskey do_set_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 23526b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t fags, datalink_media_t media) 2353d62bc4baSyz147064 { 2354d62bc4baSyz147064 dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; 2355f4b3ec61Sdh155122 dladm_status_t status; 2356f4b3ec61Sdh155122 2357d62bc4baSyz147064 if (val_cnt != 1) 2358d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2359f4b3ec61Sdh155122 23604ac67f02SAnurag S. Maskey status = do_set_radio(handle, linkid, &radio); 2361f4b3ec61Sdh155122 2362d62bc4baSyz147064 return (status); 2363d62bc4baSyz147064 } 2364f4b3ec61Sdh155122 2365d62bc4baSyz147064 static dladm_status_t 23664ac67f02SAnurag S. Maskey i_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 23674ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt) 2368d62bc4baSyz147064 { 2369d62bc4baSyz147064 char buf[MAXLINELEN]; 2370d62bc4baSyz147064 int i; 2371d62bc4baSyz147064 dladm_conf_t conf; 2372d62bc4baSyz147064 dladm_status_t status; 2373d62bc4baSyz147064 23744ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2375f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 2376f4b3ec61Sdh155122 return (status); 2377f4b3ec61Sdh155122 2378d62bc4baSyz147064 /* 2379d62bc4baSyz147064 * reset case. 2380d62bc4baSyz147064 */ 2381d62bc4baSyz147064 if (val_cnt == 0) { 23824ac67f02SAnurag S. Maskey status = dladm_unset_conf_field(handle, conf, prop_name); 2383d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 23844ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2385d62bc4baSyz147064 goto done; 2386f4b3ec61Sdh155122 } 2387f4b3ec61Sdh155122 2388d62bc4baSyz147064 buf[0] = '\0'; 2389d62bc4baSyz147064 for (i = 0; i < val_cnt; i++) { 2390d62bc4baSyz147064 (void) strlcat(buf, prop_val[i], MAXLINELEN); 2391d62bc4baSyz147064 if (i != val_cnt - 1) 2392d62bc4baSyz147064 (void) strlcat(buf, ",", MAXLINELEN); 2393d62bc4baSyz147064 } 2394f4b3ec61Sdh155122 23954ac67f02SAnurag S. Maskey status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR, 23964ac67f02SAnurag S. Maskey buf); 2397d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 23984ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2399d62bc4baSyz147064 2400d62bc4baSyz147064 done: 24014ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2402f4b3ec61Sdh155122 return (status); 2403f4b3ec61Sdh155122 } 2404f4b3ec61Sdh155122 2405f4b3ec61Sdh155122 static dladm_status_t 24064ac67f02SAnurag S. Maskey i_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 24074ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cntp) 2408f4b3ec61Sdh155122 { 2409d62bc4baSyz147064 char buf[MAXLINELEN], *str; 2410d62bc4baSyz147064 uint_t cnt = 0; 2411d62bc4baSyz147064 dladm_conf_t conf; 2412d62bc4baSyz147064 dladm_status_t status; 2413f4b3ec61Sdh155122 24144ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2415d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2416f4b3ec61Sdh155122 return (status); 2417d62bc4baSyz147064 24184ac67f02SAnurag S. Maskey status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN); 2419d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2420d62bc4baSyz147064 goto done; 2421d62bc4baSyz147064 2422d62bc4baSyz147064 str = strtok(buf, ","); 2423d62bc4baSyz147064 while (str != NULL) { 2424d62bc4baSyz147064 if (cnt == *val_cntp) { 2425d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2426d62bc4baSyz147064 goto done; 2427d62bc4baSyz147064 } 2428d62bc4baSyz147064 (void) strlcpy(prop_val[cnt++], str, DLADM_PROP_VAL_MAX); 2429d62bc4baSyz147064 str = strtok(NULL, ","); 2430f4b3ec61Sdh155122 } 2431f4b3ec61Sdh155122 2432d62bc4baSyz147064 *val_cntp = cnt; 2433f4b3ec61Sdh155122 2434d62bc4baSyz147064 done: 24354ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2436d62bc4baSyz147064 return (status); 2437f4b3ec61Sdh155122 } 2438e7801d59Ssowmini 243962ee1d25SArtem Kachitchkine /* 244062ee1d25SArtem Kachitchkine * Walk persistent private link properties of a link. 244162ee1d25SArtem Kachitchkine */ 244262ee1d25SArtem Kachitchkine static dladm_status_t 244362ee1d25SArtem Kachitchkine i_dladm_walk_linkprop_priv_db(dladm_handle_t handle, datalink_id_t linkid, 244462ee1d25SArtem Kachitchkine void *arg, int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 244562ee1d25SArtem Kachitchkine { 244662ee1d25SArtem Kachitchkine dladm_status_t status; 244762ee1d25SArtem Kachitchkine dladm_conf_t conf; 244862ee1d25SArtem Kachitchkine char last_attr[MAXLINKATTRLEN]; 244962ee1d25SArtem Kachitchkine char attr[MAXLINKATTRLEN]; 245062ee1d25SArtem Kachitchkine char attrval[MAXLINKATTRVALLEN]; 245162ee1d25SArtem Kachitchkine size_t attrsz; 245262ee1d25SArtem Kachitchkine 245362ee1d25SArtem Kachitchkine if (linkid == DATALINK_INVALID_LINKID || func == NULL) 245462ee1d25SArtem Kachitchkine return (DLADM_STATUS_BADARG); 245562ee1d25SArtem Kachitchkine 245662ee1d25SArtem Kachitchkine status = dladm_read_conf(handle, linkid, &conf); 245762ee1d25SArtem Kachitchkine if (status != DLADM_STATUS_OK) 245862ee1d25SArtem Kachitchkine return (status); 245962ee1d25SArtem Kachitchkine 246062ee1d25SArtem Kachitchkine last_attr[0] = '\0'; 246162ee1d25SArtem Kachitchkine while ((status = dladm_getnext_conf_linkprop(handle, conf, last_attr, 246262ee1d25SArtem Kachitchkine attr, attrval, MAXLINKATTRVALLEN, &attrsz)) == DLADM_STATUS_OK) { 246362ee1d25SArtem Kachitchkine if (attr[0] == '_') { 246462ee1d25SArtem Kachitchkine if (func(handle, linkid, attr, arg) == 246562ee1d25SArtem Kachitchkine DLADM_WALK_TERMINATE) 246662ee1d25SArtem Kachitchkine break; 246762ee1d25SArtem Kachitchkine } 246862ee1d25SArtem Kachitchkine (void) strlcpy(last_attr, attr, MAXLINKATTRLEN); 246962ee1d25SArtem Kachitchkine } 247062ee1d25SArtem Kachitchkine 247162ee1d25SArtem Kachitchkine dladm_destroy_conf(handle, conf); 247262ee1d25SArtem Kachitchkine return (DLADM_STATUS_OK); 247362ee1d25SArtem Kachitchkine } 247462ee1d25SArtem Kachitchkine 2475bcb5c89dSSowmini Varadhan static link_attr_t * 2476e7801d59Ssowmini dladm_name2prop(const char *prop_name) 2477e7801d59Ssowmini { 2478bcb5c89dSSowmini Varadhan link_attr_t *p; 2479e7801d59Ssowmini 2480bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2481e7801d59Ssowmini if (strcmp(p->pp_name, prop_name) == 0) 2482e7801d59Ssowmini break; 2483e7801d59Ssowmini } 2484e7801d59Ssowmini return (p); 2485e7801d59Ssowmini } 2486e7801d59Ssowmini 2487bcb5c89dSSowmini Varadhan static link_attr_t * 2488bcb5c89dSSowmini Varadhan dladm_id2prop(mac_prop_id_t propid) 2489bcb5c89dSSowmini Varadhan { 2490bcb5c89dSSowmini Varadhan link_attr_t *p; 2491bcb5c89dSSowmini Varadhan 2492bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2493bcb5c89dSSowmini Varadhan if (p->pp_id == propid) 2494bcb5c89dSSowmini Varadhan break; 2495bcb5c89dSSowmini Varadhan } 2496bcb5c89dSSowmini Varadhan return (p); 2497bcb5c89dSSowmini Varadhan } 2498e7801d59Ssowmini 24993fd94f8cSam223141 static dld_ioc_macprop_t * 2500bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_impl(size_t valsize, datalink_id_t linkid, 2501bcb5c89dSSowmini Varadhan const char *prop_name, mac_prop_id_t propid, uint_t flags, 2502bcb5c89dSSowmini Varadhan dladm_status_t *status) 2503e7801d59Ssowmini { 2504e7801d59Ssowmini int dsize; 25053fd94f8cSam223141 dld_ioc_macprop_t *dip; 2506e7801d59Ssowmini 2507e7801d59Ssowmini *status = DLADM_STATUS_OK; 25083fd94f8cSam223141 dsize = MAC_PROP_BUFSIZE(valsize); 2509e7801d59Ssowmini dip = malloc(dsize); 2510e7801d59Ssowmini if (dip == NULL) { 2511e7801d59Ssowmini *status = DLADM_STATUS_NOMEM; 2512e7801d59Ssowmini return (NULL); 2513e7801d59Ssowmini } 2514e7801d59Ssowmini bzero(dip, dsize); 2515e7801d59Ssowmini dip->pr_valsize = valsize; 25164045d941Ssowmini (void) strlcpy(dip->pr_name, prop_name, sizeof (dip->pr_name)); 25173fd94f8cSam223141 dip->pr_version = MAC_PROP_VERSION; 25186b9e797cSsowmini dip->pr_linkid = linkid; 2519bcb5c89dSSowmini Varadhan dip->pr_num = propid; 25204045d941Ssowmini dip->pr_flags = flags; 2521e7801d59Ssowmini return (dip); 2522e7801d59Ssowmini } 2523e7801d59Ssowmini 2524bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2525bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_name(size_t valsize, datalink_id_t linkid, 2526bcb5c89dSSowmini Varadhan const char *prop_name, uint_t flags, dladm_status_t *status) 2527bcb5c89dSSowmini Varadhan { 2528bcb5c89dSSowmini Varadhan link_attr_t *p; 2529bcb5c89dSSowmini Varadhan 2530bcb5c89dSSowmini Varadhan p = dladm_name2prop(prop_name); 2531bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2532bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, prop_name, p->pp_id, 2533bcb5c89dSSowmini Varadhan flags, status)); 2534bcb5c89dSSowmini Varadhan } 2535bcb5c89dSSowmini Varadhan 2536bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2537bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid, 2538bcb5c89dSSowmini Varadhan mac_prop_id_t propid, uint_t flags, dladm_status_t *status) 2539bcb5c89dSSowmini Varadhan { 2540bcb5c89dSSowmini Varadhan link_attr_t *p; 2541bcb5c89dSSowmini Varadhan 2542bcb5c89dSSowmini Varadhan p = dladm_id2prop(propid); 2543bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2544bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, p->pp_name, propid, 2545bcb5c89dSSowmini Varadhan flags, status)); 2546bcb5c89dSSowmini Varadhan } 2547bcb5c89dSSowmini Varadhan 2548e7801d59Ssowmini /* ARGSUSED */ 2549e7801d59Ssowmini static dladm_status_t 25504ac67f02SAnurag S. Maskey i_dladm_set_public_prop(dladm_handle_t handle, prop_desc_t *pdp, 25514ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 25524ac67f02SAnurag S. Maskey datalink_media_t media) 2553e7801d59Ssowmini { 25543fd94f8cSam223141 dld_ioc_macprop_t *dip; 2555e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2556e7801d59Ssowmini uint8_t u8; 2557e7801d59Ssowmini uint16_t u16; 2558e7801d59Ssowmini uint32_t u32; 2559e7801d59Ssowmini void *val; 2560e7801d59Ssowmini 2561da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 0, &status); 2562e7801d59Ssowmini if (dip == NULL) 2563e7801d59Ssowmini return (status); 2564e7801d59Ssowmini 2565da14cebeSEric Cheng if (pdp->pd_flags & PD_CHECK_ALLOC) 2566e7801d59Ssowmini val = (void *)vdp->vd_val; 2567e7801d59Ssowmini else { 2568e7801d59Ssowmini /* 2569e7801d59Ssowmini * Currently all 1/2/4-byte size properties are byte/word/int. 2570e7801d59Ssowmini * No need (yet) to distinguish these from arrays of same size. 2571e7801d59Ssowmini */ 2572e7801d59Ssowmini switch (dip->pr_valsize) { 2573e7801d59Ssowmini case 1: 2574e7801d59Ssowmini u8 = vdp->vd_val; 2575e7801d59Ssowmini val = &u8; 2576e7801d59Ssowmini break; 2577e7801d59Ssowmini case 2: 2578e7801d59Ssowmini u16 = vdp->vd_val; 2579e7801d59Ssowmini val = &u16; 2580e7801d59Ssowmini break; 2581e7801d59Ssowmini case 4: 2582e7801d59Ssowmini u32 = vdp->vd_val; 2583e7801d59Ssowmini val = &u32; 2584e7801d59Ssowmini break; 2585e7801d59Ssowmini default: 2586e7801d59Ssowmini val = &vdp->vd_val; 2587e7801d59Ssowmini break; 2588e7801d59Ssowmini } 2589e7801d59Ssowmini } 2590e7801d59Ssowmini 25913bc21d0aSAruna Ramakrishna - Sun Microsystems if (val != NULL) 2592e7801d59Ssowmini (void) memcpy(dip->pr_val, val, dip->pr_valsize); 25933bc21d0aSAruna Ramakrishna - Sun Microsystems else 25943bc21d0aSAruna Ramakrishna - Sun Microsystems dip->pr_valsize = 0; 25953bc21d0aSAruna Ramakrishna - Sun Microsystems 25964ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 2597bcb5c89dSSowmini Varadhan 2598bcb5c89dSSowmini Varadhan done: 2599bcb5c89dSSowmini Varadhan free(dip); 2600bcb5c89dSSowmini Varadhan return (status); 2601bcb5c89dSSowmini Varadhan } 2602bcb5c89dSSowmini Varadhan 2603bcb5c89dSSowmini Varadhan dladm_status_t 26044ac67f02SAnurag S. Maskey i_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set) 2605bcb5c89dSSowmini Varadhan { 2606bcb5c89dSSowmini Varadhan dladm_status_t status = DLADM_STATUS_OK; 2607bcb5c89dSSowmini Varadhan 26084ac67f02SAnurag S. Maskey if (ioctl(dladm_dld_fd(handle), 26094ac67f02SAnurag S. Maskey (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) 2610e7801d59Ssowmini status = dladm_errno2status(errno); 2611e7801d59Ssowmini 2612e7801d59Ssowmini return (status); 2613e7801d59Ssowmini } 2614e7801d59Ssowmini 26153fd94f8cSam223141 static dld_ioc_macprop_t * 26164ac67f02SAnurag S. Maskey i_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid, 26174ac67f02SAnurag S. Maskey char *prop_name, uint_t flags, dladm_status_t *status, uint_t *perm_flags) 2618e7801d59Ssowmini { 26193fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 26204045d941Ssowmini 2621bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(0, linkid, prop_name, flags, status); 26224045d941Ssowmini if (dip == NULL) 26234045d941Ssowmini return (NULL); 2624e7801d59Ssowmini 26254ac67f02SAnurag S. Maskey *status = i_dladm_macprop(handle, dip, B_FALSE); 26264045d941Ssowmini if (*status != DLADM_STATUS_OK) { 26274045d941Ssowmini free(dip); 26284045d941Ssowmini return (NULL); 26294045d941Ssowmini } 2630da14cebeSEric Cheng if (perm_flags != NULL) 2631da14cebeSEric Cheng *perm_flags = dip->pr_perm_flags; 2632da14cebeSEric Cheng 26334045d941Ssowmini return (dip); 2634e7801d59Ssowmini } 2635e7801d59Ssowmini 2636e7801d59Ssowmini /* ARGSUSED */ 2637e7801d59Ssowmini static dladm_status_t 2638*4eaa4710SRishi Srivatsavai i_dladm_uint32_check(dladm_handle_t handle, prop_desc_t *pdp, 26394ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *v, 26404ac67f02SAnurag S. Maskey datalink_media_t media) 2641e7801d59Ssowmini { 2642e7801d59Ssowmini if (val_cnt != 1) 2643e7801d59Ssowmini return (DLADM_STATUS_BADVAL); 2644*4eaa4710SRishi Srivatsavai v->vd_val = strtoul(prop_val[0], NULL, 0); 2645e7801d59Ssowmini return (DLADM_STATUS_OK); 2646e7801d59Ssowmini } 2647e7801d59Ssowmini 2648e7801d59Ssowmini /* ARGSUSED */ 2649e7801d59Ssowmini static dladm_status_t 26504ac67f02SAnurag S. Maskey i_dladm_duplex_get(dladm_handle_t handle, prop_desc_t *pdp, 26514ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 26524ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2653e7801d59Ssowmini { 2654e7801d59Ssowmini link_duplex_t link_duplex; 2655e7801d59Ssowmini dladm_status_t status; 2656e7801d59Ssowmini 26574ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", 2658e7801d59Ssowmini KSTAT_DATA_UINT32, &link_duplex)) != 0) 2659e7801d59Ssowmini return (status); 2660e7801d59Ssowmini 2661e7801d59Ssowmini switch (link_duplex) { 2662e7801d59Ssowmini case LINK_DUPLEX_FULL: 2663e7801d59Ssowmini (void) strcpy(*prop_val, "full"); 2664e7801d59Ssowmini break; 2665e7801d59Ssowmini case LINK_DUPLEX_HALF: 2666e7801d59Ssowmini (void) strcpy(*prop_val, "half"); 2667e7801d59Ssowmini break; 2668e7801d59Ssowmini default: 2669e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2670e7801d59Ssowmini break; 2671e7801d59Ssowmini } 2672e7801d59Ssowmini *val_cnt = 1; 2673e7801d59Ssowmini return (DLADM_STATUS_OK); 2674e7801d59Ssowmini } 2675e7801d59Ssowmini 2676e7801d59Ssowmini /* ARGSUSED */ 2677e7801d59Ssowmini static dladm_status_t 26784ac67f02SAnurag S. Maskey i_dladm_speed_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2679da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, uint_t flags, uint_t *perm_flags) 2680e7801d59Ssowmini { 2681e7801d59Ssowmini uint64_t ifspeed = 0; 2682e7801d59Ssowmini dladm_status_t status; 2683e7801d59Ssowmini 26844ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", 2685e7801d59Ssowmini KSTAT_DATA_UINT64, &ifspeed)) != 0) 2686e7801d59Ssowmini return (status); 26874045d941Ssowmini 26886b9e797cSsowmini if ((ifspeed % 1000000) != 0) { 26896b9e797cSsowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 26906b9e797cSsowmini "%llf", ifspeed / (float)1000000); /* Mbps */ 26916b9e797cSsowmini } else { 2692e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 2693e7801d59Ssowmini "%llu", ifspeed / 1000000); /* Mbps */ 26946b9e797cSsowmini } 2695e7801d59Ssowmini *val_cnt = 1; 2696da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2697e7801d59Ssowmini return (DLADM_STATUS_OK); 2698e7801d59Ssowmini } 2699e7801d59Ssowmini 2700e7801d59Ssowmini /* ARGSUSED */ 2701e7801d59Ssowmini static dladm_status_t 27024ac67f02SAnurag S. Maskey i_dladm_status_get(dladm_handle_t handle, prop_desc_t *pdp, 27034ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27044ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2705e7801d59Ssowmini { 2706e7801d59Ssowmini link_state_t link_state; 2707e7801d59Ssowmini dladm_status_t status; 2708e7801d59Ssowmini 27094ac67f02SAnurag S. Maskey status = i_dladm_get_state(handle, linkid, &link_state); 27104045d941Ssowmini if (status != DLADM_STATUS_OK) 2711e7801d59Ssowmini return (status); 2712da14cebeSEric Cheng 2713e7801d59Ssowmini switch (link_state) { 2714e7801d59Ssowmini case LINK_STATE_UP: 2715e7801d59Ssowmini (void) strcpy(*prop_val, "up"); 2716e7801d59Ssowmini break; 2717e7801d59Ssowmini case LINK_STATE_DOWN: 2718e7801d59Ssowmini (void) strcpy(*prop_val, "down"); 2719e7801d59Ssowmini break; 2720e7801d59Ssowmini default: 2721e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2722e7801d59Ssowmini break; 2723e7801d59Ssowmini } 2724e7801d59Ssowmini *val_cnt = 1; 27254784fcbdSSowmini Varadhan *perm_flags = MAC_PROP_PERM_READ; 2726e7801d59Ssowmini return (DLADM_STATUS_OK); 2727e7801d59Ssowmini } 2728e7801d59Ssowmini 2729e7801d59Ssowmini /* ARGSUSED */ 2730e7801d59Ssowmini static dladm_status_t 27314ac67f02SAnurag S. Maskey i_dladm_binary_get(dladm_handle_t handle, prop_desc_t *pdp, 27324ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27334ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2734e7801d59Ssowmini { 27353fd94f8cSam223141 dld_ioc_macprop_t *dip; 2736e7801d59Ssowmini dladm_status_t status; 2737e7801d59Ssowmini 27384ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2739da14cebeSEric Cheng &status, perm_flags); 27404045d941Ssowmini if (dip == NULL) 2741e7801d59Ssowmini return (status); 2742da14cebeSEric Cheng 2743e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%x", dip->pr_val[0]); 2744e7801d59Ssowmini free(dip); 2745e7801d59Ssowmini *val_cnt = 1; 2746e7801d59Ssowmini return (DLADM_STATUS_OK); 2747e7801d59Ssowmini } 2748e7801d59Ssowmini 27496b9e797cSsowmini /* ARGSUSED */ 2750e7801d59Ssowmini static dladm_status_t 27514ac67f02SAnurag S. Maskey i_dladm_uint32_get(dladm_handle_t handle, prop_desc_t *pdp, 27524ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27534ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2754e7801d59Ssowmini { 27553fd94f8cSam223141 dld_ioc_macprop_t *dip; 27564045d941Ssowmini uint32_t v = 0; 2757e7801d59Ssowmini uchar_t *cp; 2758e7801d59Ssowmini dladm_status_t status; 2759e7801d59Ssowmini 27604ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2761da14cebeSEric Cheng &status, perm_flags); 27624045d941Ssowmini if (dip == NULL) 2763e7801d59Ssowmini return (status); 2764da14cebeSEric Cheng 2765e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2766e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 27674045d941Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", v); 2768e7801d59Ssowmini free(dip); 2769e7801d59Ssowmini *val_cnt = 1; 2770e7801d59Ssowmini return (DLADM_STATUS_OK); 2771e7801d59Ssowmini } 2772e7801d59Ssowmini 2773f0f2c3a5SGirish Moodalbail /* 2774f0f2c3a5SGirish Moodalbail * Determines the size of the structure that needs to be sent to drivers 2775f0f2c3a5SGirish Moodalbail * for retrieving the property range values. 2776f0f2c3a5SGirish Moodalbail */ 2777f0f2c3a5SGirish Moodalbail static int 2778f0f2c3a5SGirish Moodalbail i_dladm_range_size(mac_propval_range_t *r, size_t *sz) 2779f0f2c3a5SGirish Moodalbail { 2780f0f2c3a5SGirish Moodalbail uint_t count = r->mpr_count; 2781f0f2c3a5SGirish Moodalbail 2782f0f2c3a5SGirish Moodalbail *sz = sizeof (mac_propval_range_t); 2783f0f2c3a5SGirish Moodalbail --count; 2784f0f2c3a5SGirish Moodalbail 2785f0f2c3a5SGirish Moodalbail switch (r->mpr_type) { 2786f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: 2787f0f2c3a5SGirish Moodalbail *sz += (count * sizeof (mac_propval_uint32_range_t)); 2788f0f2c3a5SGirish Moodalbail return (0); 2789f0f2c3a5SGirish Moodalbail default: 2790f0f2c3a5SGirish Moodalbail break; 2791f0f2c3a5SGirish Moodalbail } 2792f0f2c3a5SGirish Moodalbail *sz = 0; 2793f0f2c3a5SGirish Moodalbail return (EINVAL); 2794f0f2c3a5SGirish Moodalbail } 2795f0f2c3a5SGirish Moodalbail 2796f0f2c3a5SGirish Moodalbail /* ARGSUSED */ 2797f0f2c3a5SGirish Moodalbail static dladm_status_t 2798f0f2c3a5SGirish Moodalbail i_dladm_range_get(dladm_handle_t handle, prop_desc_t *pdp, 2799f0f2c3a5SGirish Moodalbail datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2800f0f2c3a5SGirish Moodalbail datalink_media_t media, uint_t flags, uint_t *perm_flags) 2801f0f2c3a5SGirish Moodalbail { 2802f0f2c3a5SGirish Moodalbail dld_ioc_macprop_t *dip; 2803f0f2c3a5SGirish Moodalbail dladm_status_t status = DLADM_STATUS_OK; 2804f0f2c3a5SGirish Moodalbail size_t sz; 2805f0f2c3a5SGirish Moodalbail mac_propval_range_t *rangep; 2806f0f2c3a5SGirish Moodalbail 2807f0f2c3a5SGirish Moodalbail sz = sizeof (mac_propval_range_t); 2808f0f2c3a5SGirish Moodalbail 2809f0f2c3a5SGirish Moodalbail /* 2810f0f2c3a5SGirish Moodalbail * As caller we don't know number of value ranges, the driver 2811f0f2c3a5SGirish Moodalbail * supports. To begin with we assume that number to be 1. If the 2812f0f2c3a5SGirish Moodalbail * buffer size is insufficient, driver returns back with the 2813f0f2c3a5SGirish Moodalbail * actual count of value ranges. See mac.h for more details. 2814f0f2c3a5SGirish Moodalbail */ 2815f0f2c3a5SGirish Moodalbail retry: 2816f0f2c3a5SGirish Moodalbail if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags, 2817f0f2c3a5SGirish Moodalbail &status)) == NULL) 2818f0f2c3a5SGirish Moodalbail return (status); 2819f0f2c3a5SGirish Moodalbail 2820f0f2c3a5SGirish Moodalbail status = i_dladm_macprop(handle, dip, B_FALSE); 2821f0f2c3a5SGirish Moodalbail if (status != DLADM_STATUS_OK) { 2822f0f2c3a5SGirish Moodalbail if (status == DLADM_STATUS_TOOSMALL) { 2823f0f2c3a5SGirish Moodalbail int err; 2824f0f2c3a5SGirish Moodalbail 2825f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2826f0f2c3a5SGirish Moodalbail if ((err = i_dladm_range_size(rangep, &sz)) == 0) { 2827f0f2c3a5SGirish Moodalbail free(dip); 2828f0f2c3a5SGirish Moodalbail goto retry; 2829f0f2c3a5SGirish Moodalbail } else { 2830f0f2c3a5SGirish Moodalbail status = dladm_errno2status(err); 2831f0f2c3a5SGirish Moodalbail } 2832f0f2c3a5SGirish Moodalbail } 2833f0f2c3a5SGirish Moodalbail free(dip); 2834f0f2c3a5SGirish Moodalbail return (status); 2835f0f2c3a5SGirish Moodalbail } 2836f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2837f0f2c3a5SGirish Moodalbail 2838f0f2c3a5SGirish Moodalbail switch (rangep->mpr_type) { 2839f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: { 2840f0f2c3a5SGirish Moodalbail mac_propval_uint32_range_t *ur; 2841f0f2c3a5SGirish Moodalbail uint_t count = rangep->mpr_count, i; 2842f0f2c3a5SGirish Moodalbail 2843f0f2c3a5SGirish Moodalbail ur = &rangep->range_uint32[0]; 2844f0f2c3a5SGirish Moodalbail 2845f0f2c3a5SGirish Moodalbail for (i = 0; i < count; i++, ur++) { 2846f0f2c3a5SGirish Moodalbail if (ur->mpur_min == ur->mpur_max) { 2847f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2848f0f2c3a5SGirish Moodalbail "%ld", ur->mpur_min); 2849f0f2c3a5SGirish Moodalbail } else { 2850f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2851f0f2c3a5SGirish Moodalbail "%ld-%ld", ur->mpur_min, ur->mpur_max); 2852f0f2c3a5SGirish Moodalbail } 2853f0f2c3a5SGirish Moodalbail } 2854f0f2c3a5SGirish Moodalbail *val_cnt = count; 2855f0f2c3a5SGirish Moodalbail break; 2856f0f2c3a5SGirish Moodalbail } 2857f0f2c3a5SGirish Moodalbail default: 2858f0f2c3a5SGirish Moodalbail status = DLADM_STATUS_BADARG; 2859f0f2c3a5SGirish Moodalbail break; 2860f0f2c3a5SGirish Moodalbail } 2861f0f2c3a5SGirish Moodalbail free(dip); 2862f0f2c3a5SGirish Moodalbail return (status); 2863f0f2c3a5SGirish Moodalbail } 2864f0f2c3a5SGirish Moodalbail 28656b9e797cSsowmini /* ARGSUSED */ 2866e7801d59Ssowmini static dladm_status_t 2867e75f0919SSebastien Roy i_dladm_tagmode_get(dladm_handle_t handle, prop_desc_t *pdp, 2868e75f0919SSebastien Roy datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2869e75f0919SSebastien Roy datalink_media_t media, uint_t flags, uint_t *perm_flags) 2870e75f0919SSebastien Roy { 2871e75f0919SSebastien Roy dld_ioc_macprop_t *dip; 2872e75f0919SSebastien Roy link_tagmode_t mode; 2873e75f0919SSebastien Roy dladm_status_t status; 2874e75f0919SSebastien Roy 2875e75f0919SSebastien Roy dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2876e75f0919SSebastien Roy &status, perm_flags); 2877e75f0919SSebastien Roy if (dip == NULL) 2878e75f0919SSebastien Roy return (status); 2879e75f0919SSebastien Roy (void) memcpy(&mode, dip->pr_val, sizeof (mode)); 2880e75f0919SSebastien Roy free(dip); 2881e75f0919SSebastien Roy 2882e75f0919SSebastien Roy switch (mode) { 2883e75f0919SSebastien Roy case LINK_TAGMODE_NORMAL: 2884e75f0919SSebastien Roy (void) strlcpy(*prop_val, "normal", DLADM_PROP_VAL_MAX); 2885e75f0919SSebastien Roy break; 2886e75f0919SSebastien Roy case LINK_TAGMODE_VLANONLY: 2887e75f0919SSebastien Roy (void) strlcpy(*prop_val, "vlanonly", DLADM_PROP_VAL_MAX); 2888e75f0919SSebastien Roy break; 2889e75f0919SSebastien Roy default: 2890e75f0919SSebastien Roy (void) strlcpy(*prop_val, "unknown", DLADM_PROP_VAL_MAX); 2891e75f0919SSebastien Roy } 2892e75f0919SSebastien Roy *val_cnt = 1; 2893e75f0919SSebastien Roy return (DLADM_STATUS_OK); 2894e75f0919SSebastien Roy } 2895e75f0919SSebastien Roy 2896e75f0919SSebastien Roy /* ARGSUSED */ 2897e75f0919SSebastien Roy static dladm_status_t 28984ac67f02SAnurag S. Maskey i_dladm_flowctl_get(dladm_handle_t handle, prop_desc_t *pdp, 28994ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 29004ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2901e7801d59Ssowmini { 29023fd94f8cSam223141 dld_ioc_macprop_t *dip; 2903e7801d59Ssowmini link_flowctrl_t v; 2904e7801d59Ssowmini dladm_status_t status; 2905e7801d59Ssowmini uchar_t *cp; 2906e7801d59Ssowmini 29074ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2908da14cebeSEric Cheng &status, perm_flags); 29094045d941Ssowmini if (dip == NULL) 2910e7801d59Ssowmini return (status); 2911da14cebeSEric Cheng 2912e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2913e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 2914e7801d59Ssowmini switch (v) { 2915e7801d59Ssowmini case LINK_FLOWCTRL_NONE: 2916e7801d59Ssowmini (void) sprintf(*prop_val, "no"); 2917e7801d59Ssowmini break; 2918e7801d59Ssowmini case LINK_FLOWCTRL_RX: 2919e7801d59Ssowmini (void) sprintf(*prop_val, "rx"); 2920e7801d59Ssowmini break; 2921e7801d59Ssowmini case LINK_FLOWCTRL_TX: 2922e7801d59Ssowmini (void) sprintf(*prop_val, "tx"); 2923e7801d59Ssowmini break; 2924e7801d59Ssowmini case LINK_FLOWCTRL_BI: 2925e7801d59Ssowmini (void) sprintf(*prop_val, "bi"); 2926e7801d59Ssowmini break; 2927e7801d59Ssowmini } 2928e7801d59Ssowmini free(dip); 2929e7801d59Ssowmini *val_cnt = 1; 2930e7801d59Ssowmini return (DLADM_STATUS_OK); 2931e7801d59Ssowmini } 2932e7801d59Ssowmini 2933e7801d59Ssowmini 2934e7801d59Ssowmini /* ARGSUSED */ 2935e7801d59Ssowmini static dladm_status_t 29363361618bSRishi Srivatsavai i_dladm_set_private_prop(dladm_handle_t handle, datalink_id_t linkid, 29374ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 29384ac67f02SAnurag S. Maskey 2939e7801d59Ssowmini { 2940bcb5c89dSSowmini Varadhan int i, slen; 2941eae72b5bSSebastien Roy int bufsize = 0; 29423fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 2943e7801d59Ssowmini uchar_t *dp; 2944bcb5c89dSSowmini Varadhan link_attr_t *p; 29454045d941Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2946e7801d59Ssowmini 2947e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 2948e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 2949e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2950e7801d59Ssowmini p = dladm_name2prop(prop_name); 29513fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 2952e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2953e7801d59Ssowmini 29543361618bSRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE)) 29553361618bSRishi Srivatsavai return (DLADM_STATUS_OK); 29563361618bSRishi Srivatsavai 2957e7801d59Ssowmini /* 2958e7801d59Ssowmini * private properties: all parsing is done in the kernel. 2959e7801d59Ssowmini * allocate a enough space for each property + its separator (','). 2960e7801d59Ssowmini */ 2961e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2962e7801d59Ssowmini bufsize += strlen(prop_val[i]) + 1; 2963e7801d59Ssowmini } 29644045d941Ssowmini 29654045d941Ssowmini if (prop_val == NULL) { 29664045d941Ssowmini /* 29674045d941Ssowmini * getting default value. so use more buffer space. 29684045d941Ssowmini */ 2969bcb5c89dSSowmini Varadhan bufsize += DLADM_PROP_BUF_CHUNK; 29704045d941Ssowmini } 29714045d941Ssowmini 2972bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(bufsize + 1, linkid, prop_name, 29733fd94f8cSam223141 (prop_val != NULL ? 0 : MAC_PROP_DEFAULT), &status); 2974e7801d59Ssowmini if (dip == NULL) 2975e7801d59Ssowmini return (status); 2976e7801d59Ssowmini 2977e7801d59Ssowmini dp = (uchar_t *)dip->pr_val; 2978e7801d59Ssowmini slen = 0; 2979bcb5c89dSSowmini Varadhan 29804045d941Ssowmini if (prop_val == NULL) { 29814ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_FALSE); 298262ee1d25SArtem Kachitchkine dip->pr_flags = 0; 29834045d941Ssowmini } else { 2984e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2985e7801d59Ssowmini int plen = 0; 2986e7801d59Ssowmini 2987e7801d59Ssowmini plen = strlen(prop_val[i]); 2988e7801d59Ssowmini bcopy(prop_val[i], dp, plen); 2989e7801d59Ssowmini slen += plen; 2990e7801d59Ssowmini /* 2991e7801d59Ssowmini * add a "," separator and update dp. 2992e7801d59Ssowmini */ 2993e7801d59Ssowmini if (i != (val_cnt -1)) 2994e7801d59Ssowmini dp[slen++] = ','; 2995e7801d59Ssowmini dp += (plen + 1); 2996e7801d59Ssowmini } 2997e7801d59Ssowmini } 299862ee1d25SArtem Kachitchkine if (status == DLADM_STATUS_OK) 299962ee1d25SArtem Kachitchkine status = i_dladm_macprop(handle, dip, B_TRUE); 30004045d941Ssowmini 3001e7801d59Ssowmini free(dip); 3002e7801d59Ssowmini return (status); 3003e7801d59Ssowmini } 3004e7801d59Ssowmini 3005e7801d59Ssowmini static dladm_status_t 300662ee1d25SArtem Kachitchkine i_dladm_get_priv_prop(dladm_handle_t handle, datalink_id_t linkid, 30074ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cnt, 30084ac67f02SAnurag S. Maskey dladm_prop_type_t type, uint_t dld_flags) 3009e7801d59Ssowmini { 3010e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 30113fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 3012bcb5c89dSSowmini Varadhan link_attr_t *p; 3013e7801d59Ssowmini 3014e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 3015e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 3016e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3017e7801d59Ssowmini 3018e7801d59Ssowmini p = dladm_name2prop(prop_name); 30193fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 3020e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3021e7801d59Ssowmini 3022e7801d59Ssowmini /* 3023e7801d59Ssowmini * private properties: all parsing is done in the kernel. 3024e7801d59Ssowmini */ 3025bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(DLADM_PROP_BUF_CHUNK, linkid, prop_name, 3026bcb5c89dSSowmini Varadhan dld_flags, &status); 3027e7801d59Ssowmini if (dip == NULL) 3028e7801d59Ssowmini return (status); 3029e7801d59Ssowmini 30304ac67f02SAnurag S. Maskey if ((status = i_dladm_macprop(handle, dip, B_FALSE)) == 30314ac67f02SAnurag S. Maskey DLADM_STATUS_OK) { 3032afdda45fSVasumathi Sundaram - Sun Microsystems if (type == DLADM_PROP_VAL_PERM) { 3033da14cebeSEric Cheng (void) dladm_perm2str(dip->pr_perm_flags, *prop_val); 303462ee1d25SArtem Kachitchkine } else if (type == DLADM_PROP_VAL_MODIFIABLE) { 303562ee1d25SArtem Kachitchkine *prop_val[0] = '\0'; 3036afdda45fSVasumathi Sundaram - Sun Microsystems } else { 3037afdda45fSVasumathi Sundaram - Sun Microsystems (void) strncpy(*prop_val, dip->pr_val, 3038afdda45fSVasumathi Sundaram - Sun Microsystems DLADM_PROP_VAL_MAX); 3039afdda45fSVasumathi Sundaram - Sun Microsystems } 3040e7801d59Ssowmini *val_cnt = 1; 304162ee1d25SArtem Kachitchkine } else if ((status == DLADM_STATUS_NOTSUP) && 304262ee1d25SArtem Kachitchkine (type == DLADM_PROP_VAL_CURRENT)) { 304362ee1d25SArtem Kachitchkine status = DLADM_STATUS_NOTFOUND; 3044e7801d59Ssowmini } 30454045d941Ssowmini free(dip); 30464045d941Ssowmini return (status); 30474045d941Ssowmini } 30484045d941Ssowmini 30494045d941Ssowmini 30504045d941Ssowmini static dladm_status_t 30514ac67f02SAnurag S. Maskey i_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp, 30524ac67f02SAnurag S. Maskey datalink_id_t linkid, datalink_media_t media, uint_t flags) 30534045d941Ssowmini { 30544045d941Ssowmini dladm_status_t status; 30554045d941Ssowmini char **prop_vals = NULL, *buf; 30564045d941Ssowmini size_t bufsize; 30574045d941Ssowmini uint_t cnt; 30584045d941Ssowmini int i; 3059afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 30604045d941Ssowmini 30614045d941Ssowmini /* 30624045d941Ssowmini * Allocate buffer needed for prop_vals array. We can have at most 30634045d941Ssowmini * DLADM_MAX_PROP_VALCNT char *prop_vals[] entries, where 30644045d941Ssowmini * each entry has max size DLADM_PROP_VAL_MAX 30654045d941Ssowmini */ 30664045d941Ssowmini bufsize = 30674045d941Ssowmini (sizeof (char *) + DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT; 30684045d941Ssowmini buf = malloc(bufsize); 30694045d941Ssowmini prop_vals = (char **)(void *)buf; 30704045d941Ssowmini for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) { 30714045d941Ssowmini prop_vals[i] = buf + 30724045d941Ssowmini sizeof (char *) * DLADM_MAX_PROP_VALCNT + 30734045d941Ssowmini i * DLADM_PROP_VAL_MAX; 30744045d941Ssowmini } 307513a55820Sar224390 307613a55820Sar224390 /* 30773bc21d0aSAruna Ramakrishna - Sun Microsystems * For properties which have pdp->pd_defval.vd_name as a non-empty 30783bc21d0aSAruna Ramakrishna - Sun Microsystems * string, the "" itself is used to reset the property (exceptions 30793bc21d0aSAruna Ramakrishna - Sun Microsystems * are zone and autopush, which populate vdp->vd_val). So 30803bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm can copy pdp->pd_defval over to the val_desc_t passed 30813bc21d0aSAruna Ramakrishna - Sun Microsystems * down on the setprop using the global values in the table. For 30823bc21d0aSAruna Ramakrishna - Sun Microsystems * other cases (vd_name is ""), doing reset-linkprop will cause 30833bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm to do a getprop to find the default value and then do 30843bc21d0aSAruna Ramakrishna - Sun Microsystems * a setprop to reset the value to default. 308513a55820Sar224390 */ 30864ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media, 3087afdda45fSVasumathi Sundaram - Sun Microsystems MAC_PROP_DEFAULT, &perm_flags); 30884045d941Ssowmini if (status == DLADM_STATUS_OK) { 3089afdda45fSVasumathi Sundaram - Sun Microsystems if (perm_flags == MAC_PROP_PERM_RW) { 30904ac67f02SAnurag S. Maskey status = i_dladm_set_single_prop(handle, linkid, 30914ac67f02SAnurag S. Maskey pdp->pd_class, media, pdp, prop_vals, cnt, flags); 30924045d941Ssowmini } 3093afdda45fSVasumathi Sundaram - Sun Microsystems else 3094afdda45fSVasumathi Sundaram - Sun Microsystems status = DLADM_STATUS_NOTSUP; 3095afdda45fSVasumathi Sundaram - Sun Microsystems } 30964045d941Ssowmini free(buf); 3097e7801d59Ssowmini return (status); 3098e7801d59Ssowmini } 3099bcb5c89dSSowmini Varadhan 3100*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3101*4eaa4710SRishi Srivatsavai static dladm_status_t 3102*4eaa4710SRishi Srivatsavai get_stp_prop(dladm_handle_t handle, struct prop_desc *pd, datalink_id_t linkid, 3103*4eaa4710SRishi Srivatsavai char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, 3104*4eaa4710SRishi Srivatsavai uint_t *perm_flags) 3105*4eaa4710SRishi Srivatsavai { 3106*4eaa4710SRishi Srivatsavai const bridge_public_prop_t *bpp; 3107*4eaa4710SRishi Srivatsavai dladm_status_t retv; 3108*4eaa4710SRishi Srivatsavai int val, i; 3109*4eaa4710SRishi Srivatsavai 3110*4eaa4710SRishi Srivatsavai if (flags != 0) 3111*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 3112*4eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 3113*4eaa4710SRishi Srivatsavai *val_cnt = 1; 3114*4eaa4710SRishi Srivatsavai for (bpp = bridge_prop; bpp->bpp_name != NULL; bpp++) 3115*4eaa4710SRishi Srivatsavai if (strcmp(bpp->bpp_name, pd->pd_name) == 0) 3116*4eaa4710SRishi Srivatsavai break; 3117*4eaa4710SRishi Srivatsavai retv = dladm_bridge_get_port_cfg(handle, linkid, bpp->bpp_code, &val); 3118*4eaa4710SRishi Srivatsavai /* If the daemon isn't running, then return the persistent value */ 3119*4eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 3120*4eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 3121*4eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 3122*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 3123*4eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 3124*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3125*4eaa4710SRishi Srivatsavai } 3126*4eaa4710SRishi Srivatsavai if (retv != DLADM_STATUS_OK) { 3127*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 3128*4eaa4710SRishi Srivatsavai return (retv); 3129*4eaa4710SRishi Srivatsavai } 3130*4eaa4710SRishi Srivatsavai if (val == pd->pd_defval.vd_val && pd->pd_defval.vd_name[0] != '\0') { 3131*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 3132*4eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 3133*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3134*4eaa4710SRishi Srivatsavai } 3135*4eaa4710SRishi Srivatsavai for (i = 0; i < pd->pd_noptval; i++) { 3136*4eaa4710SRishi Srivatsavai if (val == pd->pd_optval[i].vd_val) { 3137*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_optval[i].vd_name, 3138*4eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 3139*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3140*4eaa4710SRishi Srivatsavai } 3141*4eaa4710SRishi Srivatsavai } 3142*4eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", (unsigned)val); 3143*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3144*4eaa4710SRishi Srivatsavai } 3145*4eaa4710SRishi Srivatsavai 3146*4eaa4710SRishi Srivatsavai /* ARGSUSED1 */ 3147*4eaa4710SRishi Srivatsavai static dladm_status_t 3148*4eaa4710SRishi Srivatsavai set_stp_prop(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 3149*4eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 3150*4eaa4710SRishi Srivatsavai { 3151*4eaa4710SRishi Srivatsavai /* 3152*4eaa4710SRishi Srivatsavai * Special case for mcheck: the daemon resets the value to zero, and we 3153*4eaa4710SRishi Srivatsavai * don't want the daemon to refresh itself; it leads to deadlock. 3154*4eaa4710SRishi Srivatsavai */ 3155*4eaa4710SRishi Srivatsavai if (flags & DLADM_OPT_NOREFRESH) 3156*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3157*4eaa4710SRishi Srivatsavai 3158*4eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 3159*4eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 3160*4eaa4710SRishi Srivatsavai } 3161*4eaa4710SRishi Srivatsavai 3162*4eaa4710SRishi Srivatsavai /* 3163*4eaa4710SRishi Srivatsavai * This is used only for stp_priority, stp_cost, and stp_mcheck. 3164*4eaa4710SRishi Srivatsavai */ 3165*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3166*4eaa4710SRishi Srivatsavai static dladm_status_t 3167*4eaa4710SRishi Srivatsavai check_stp_prop(dladm_handle_t handle, struct prop_desc *pd, 3168*4eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 3169*4eaa4710SRishi Srivatsavai datalink_media_t media) 3170*4eaa4710SRishi Srivatsavai { 3171*4eaa4710SRishi Srivatsavai char *cp; 3172*4eaa4710SRishi Srivatsavai boolean_t iscost; 3173*4eaa4710SRishi Srivatsavai 3174*4eaa4710SRishi Srivatsavai if (val_cnt != 1) 3175*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 3176*4eaa4710SRishi Srivatsavai 3177*4eaa4710SRishi Srivatsavai if (prop_val == NULL) { 3178*4eaa4710SRishi Srivatsavai vdp->vd_val = 0; 3179*4eaa4710SRishi Srivatsavai } else { 3180*4eaa4710SRishi Srivatsavai /* Only stp_priority and stp_cost use this function */ 3181*4eaa4710SRishi Srivatsavai iscost = strcmp(pd->pd_name, "stp_cost") == 0; 3182*4eaa4710SRishi Srivatsavai 3183*4eaa4710SRishi Srivatsavai if (iscost && strcmp(prop_val[0], "auto") == 0) { 3184*4eaa4710SRishi Srivatsavai /* Illegal value 0 is allowed to mean "automatic" */ 3185*4eaa4710SRishi Srivatsavai vdp->vd_val = 0; 3186*4eaa4710SRishi Srivatsavai } else { 3187*4eaa4710SRishi Srivatsavai errno = 0; 3188*4eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 3189*4eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 3190*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 3191*4eaa4710SRishi Srivatsavai } 3192*4eaa4710SRishi Srivatsavai } 3193*4eaa4710SRishi Srivatsavai 3194*4eaa4710SRishi Srivatsavai if (iscost) { 3195*4eaa4710SRishi Srivatsavai return (vdp->vd_val > 65535 ? DLADM_STATUS_BADVAL : 3196*4eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 3197*4eaa4710SRishi Srivatsavai } else { 3198*4eaa4710SRishi Srivatsavai if (vdp->vd_val > 255) 3199*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 3200*4eaa4710SRishi Srivatsavai /* 3201*4eaa4710SRishi Srivatsavai * If the user is setting stp_mcheck non-zero, then (per the 3202*4eaa4710SRishi Srivatsavai * IEEE management standards and UNH testing) we need to check 3203*4eaa4710SRishi Srivatsavai * whether this link is part of a bridge that is running RSTP. 3204*4eaa4710SRishi Srivatsavai * If it's not, then setting the flag is an error. Note that 3205*4eaa4710SRishi Srivatsavai * errors are intentionally discarded here; it's the value 3206*4eaa4710SRishi Srivatsavai * that's the problem -- it's not a bad value, merely one that 3207*4eaa4710SRishi Srivatsavai * can't be used now. 3208*4eaa4710SRishi Srivatsavai */ 3209*4eaa4710SRishi Srivatsavai if (strcmp(pd->pd_name, "stp_mcheck") == 0 && 3210*4eaa4710SRishi Srivatsavai vdp->vd_val != 0) { 3211*4eaa4710SRishi Srivatsavai char bridge[MAXLINKNAMELEN]; 3212*4eaa4710SRishi Srivatsavai UID_STP_CFG_T cfg; 3213*4eaa4710SRishi Srivatsavai dladm_bridge_prot_t brprot; 3214*4eaa4710SRishi Srivatsavai 3215*4eaa4710SRishi Srivatsavai if (dladm_bridge_getlink(handle, linkid, bridge, 3216*4eaa4710SRishi Srivatsavai sizeof (bridge)) != DLADM_STATUS_OK || 3217*4eaa4710SRishi Srivatsavai dladm_bridge_get_properties(bridge, &cfg, 3218*4eaa4710SRishi Srivatsavai &brprot) != DLADM_STATUS_OK) 3219*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 3220*4eaa4710SRishi Srivatsavai if (cfg.force_version <= 1) 3221*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 3222*4eaa4710SRishi Srivatsavai } 3223*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3224*4eaa4710SRishi Srivatsavai } 3225*4eaa4710SRishi Srivatsavai } 3226*4eaa4710SRishi Srivatsavai 3227*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3228*4eaa4710SRishi Srivatsavai static dladm_status_t 3229*4eaa4710SRishi Srivatsavai get_bridge_forward(dladm_handle_t handle, struct prop_desc *pd, 3230*4eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 3231*4eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 3232*4eaa4710SRishi Srivatsavai { 3233*4eaa4710SRishi Srivatsavai dladm_status_t retv; 3234*4eaa4710SRishi Srivatsavai uint_t val; 3235*4eaa4710SRishi Srivatsavai 3236*4eaa4710SRishi Srivatsavai if (flags != 0) 3237*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 3238*4eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 3239*4eaa4710SRishi Srivatsavai *val_cnt = 1; 3240*4eaa4710SRishi Srivatsavai retv = dladm_bridge_get_forwarding(handle, linkid, &val); 3241*4eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 3242*4eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 3243*4eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 3244*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 3245*4eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 3246*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 3247*4eaa4710SRishi Srivatsavai } 3248*4eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_OK) 3249*4eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", val); 3250*4eaa4710SRishi Srivatsavai else 3251*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 3252*4eaa4710SRishi Srivatsavai return (retv); 3253*4eaa4710SRishi Srivatsavai } 3254*4eaa4710SRishi Srivatsavai 3255*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3256*4eaa4710SRishi Srivatsavai static dladm_status_t 3257*4eaa4710SRishi Srivatsavai set_bridge_forward(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 3258*4eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 3259*4eaa4710SRishi Srivatsavai { 3260*4eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 3261*4eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 3262*4eaa4710SRishi Srivatsavai } 3263*4eaa4710SRishi Srivatsavai 3264*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3265*4eaa4710SRishi Srivatsavai static dladm_status_t 3266*4eaa4710SRishi Srivatsavai get_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 3267*4eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 3268*4eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 3269*4eaa4710SRishi Srivatsavai { 3270*4eaa4710SRishi Srivatsavai dladm_status_t status; 3271*4eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 3272*4eaa4710SRishi Srivatsavai uint16_t pvid; 3273*4eaa4710SRishi Srivatsavai 3274*4eaa4710SRishi Srivatsavai if (flags != 0) 3275*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 3276*4eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 3277*4eaa4710SRishi Srivatsavai *val_cnt = 1; 3278*4eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 3279*4eaa4710SRishi Srivatsavai 0, &status); 3280*4eaa4710SRishi Srivatsavai if (dip == NULL) 3281*4eaa4710SRishi Srivatsavai return (status); 3282*4eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_FALSE); 3283*4eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 3284*4eaa4710SRishi Srivatsavai (void) memcpy(&pvid, dip->pr_val, sizeof (pvid)); 3285*4eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", pvid); 3286*4eaa4710SRishi Srivatsavai } else { 3287*4eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 3288*4eaa4710SRishi Srivatsavai } 3289*4eaa4710SRishi Srivatsavai free(dip); 3290*4eaa4710SRishi Srivatsavai return (status); 3291*4eaa4710SRishi Srivatsavai } 3292*4eaa4710SRishi Srivatsavai 3293*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3294*4eaa4710SRishi Srivatsavai static dladm_status_t 3295*4eaa4710SRishi Srivatsavai set_bridge_pvid(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 3296*4eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 3297*4eaa4710SRishi Srivatsavai { 3298*4eaa4710SRishi Srivatsavai dladm_status_t status; 3299*4eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 3300*4eaa4710SRishi Srivatsavai uint16_t pvid; 3301*4eaa4710SRishi Srivatsavai 3302*4eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 3303*4eaa4710SRishi Srivatsavai 0, &status); 3304*4eaa4710SRishi Srivatsavai if (dip == NULL) 3305*4eaa4710SRishi Srivatsavai return (status); 3306*4eaa4710SRishi Srivatsavai pvid = vdp->vd_val; 3307*4eaa4710SRishi Srivatsavai (void) memcpy(dip->pr_val, &pvid, sizeof (pvid)); 3308*4eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_TRUE); 3309*4eaa4710SRishi Srivatsavai free(dip); 3310*4eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 3311*4eaa4710SRishi Srivatsavai return (status); 3312*4eaa4710SRishi Srivatsavai 3313*4eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 3314*4eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 3315*4eaa4710SRishi Srivatsavai } 3316*4eaa4710SRishi Srivatsavai 3317*4eaa4710SRishi Srivatsavai /* ARGSUSED */ 3318*4eaa4710SRishi Srivatsavai static dladm_status_t 3319*4eaa4710SRishi Srivatsavai check_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 3320*4eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 3321*4eaa4710SRishi Srivatsavai datalink_media_t media) 3322*4eaa4710SRishi Srivatsavai { 3323*4eaa4710SRishi Srivatsavai char *cp; 3324*4eaa4710SRishi Srivatsavai 3325*4eaa4710SRishi Srivatsavai if (val_cnt != 1) 3326*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 3327*4eaa4710SRishi Srivatsavai 3328*4eaa4710SRishi Srivatsavai if (prop_val == NULL) { 3329*4eaa4710SRishi Srivatsavai vdp->vd_val = 1; 3330*4eaa4710SRishi Srivatsavai } else { 3331*4eaa4710SRishi Srivatsavai errno = 0; 3332*4eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 3333*4eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 3334*4eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 3335*4eaa4710SRishi Srivatsavai } 3336*4eaa4710SRishi Srivatsavai 3337*4eaa4710SRishi Srivatsavai return (vdp->vd_val > VLAN_ID_MAX ? DLADM_STATUS_BADVAL : 3338*4eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 3339*4eaa4710SRishi Srivatsavai } 3340*4eaa4710SRishi Srivatsavai 3341bcb5c89dSSowmini Varadhan dladm_status_t 33424ac67f02SAnurag S. Maskey i_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf, 33434ac67f02SAnurag S. Maskey mac_prop_id_t cmd, size_t len, boolean_t set) 3344bcb5c89dSSowmini Varadhan { 3345bcb5c89dSSowmini Varadhan uint32_t flags; 3346bcb5c89dSSowmini Varadhan dladm_status_t status; 3347bcb5c89dSSowmini Varadhan uint32_t media; 3348bcb5c89dSSowmini Varadhan dld_ioc_macprop_t *dip; 3349bcb5c89dSSowmini Varadhan void *dp; 3350bcb5c89dSSowmini Varadhan 33514ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, 33524ac67f02SAnurag S. Maskey &media, NULL, 0)) != DLADM_STATUS_OK) { 3353bcb5c89dSSowmini Varadhan return (status); 3354bcb5c89dSSowmini Varadhan } 3355bcb5c89dSSowmini Varadhan 3356bcb5c89dSSowmini Varadhan if (media != DL_WIFI) 3357bcb5c89dSSowmini Varadhan return (DLADM_STATUS_BADARG); 3358bcb5c89dSSowmini Varadhan 3359bcb5c89dSSowmini Varadhan if (!(flags & DLADM_OPT_ACTIVE)) 3360bcb5c89dSSowmini Varadhan return (DLADM_STATUS_TEMPONLY); 3361bcb5c89dSSowmini Varadhan 3362bcb5c89dSSowmini Varadhan if (len == (MAX_BUF_LEN - WIFI_BUF_OFFSET)) 3363bcb5c89dSSowmini Varadhan len = MAX_BUF_LEN - sizeof (dld_ioc_macprop_t) - 1; 3364bcb5c89dSSowmini Varadhan 3365bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_id(len, linkid, cmd, 0, &status); 3366bcb5c89dSSowmini Varadhan if (dip == NULL) 3367bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 3368bcb5c89dSSowmini Varadhan 3369bcb5c89dSSowmini Varadhan dp = (uchar_t *)dip->pr_val; 3370bcb5c89dSSowmini Varadhan if (set) 3371bcb5c89dSSowmini Varadhan (void) memcpy(dp, buf, len); 3372bcb5c89dSSowmini Varadhan 33734ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, set); 33740b8f0546SSowmini Varadhan if (status == DLADM_STATUS_OK) { 3375bcb5c89dSSowmini Varadhan if (!set) 3376bcb5c89dSSowmini Varadhan (void) memcpy(buf, dp, len); 3377bcb5c89dSSowmini Varadhan } 3378bcb5c89dSSowmini Varadhan 3379bcb5c89dSSowmini Varadhan free(dip); 3380bcb5c89dSSowmini Varadhan return (status); 3381bcb5c89dSSowmini Varadhan } 3382bcb5c89dSSowmini Varadhan 3383da14cebeSEric Cheng dladm_status_t 3384da14cebeSEric Cheng dladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues) 3385da14cebeSEric Cheng { 338662ee1d25SArtem Kachitchkine return (dladm_parse_args(str, listp, novalues)); 3387da14cebeSEric Cheng } 3388da14cebeSEric Cheng 3389da14cebeSEric Cheng /* 3390da14cebeSEric Cheng * Retrieve the one link property from the database 3391da14cebeSEric Cheng */ 3392da14cebeSEric Cheng /*ARGSUSED*/ 3393da14cebeSEric Cheng static int 33944ac67f02SAnurag S. Maskey i_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid, 33954ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 3396da14cebeSEric Cheng { 3397da14cebeSEric Cheng dladm_arg_list_t *proplist = arg; 3398da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3399da14cebeSEric Cheng 3400da14cebeSEric Cheng aip = &proplist->al_info[proplist->al_count]; 3401da14cebeSEric Cheng /* 3402da14cebeSEric Cheng * it is fine to point to prop_name since prop_name points to the 3403da14cebeSEric Cheng * prop_table[n].pd_name. 3404da14cebeSEric Cheng */ 3405da14cebeSEric Cheng aip->ai_name = prop_name; 3406da14cebeSEric Cheng 34074ac67f02SAnurag S. Maskey (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 34084ac67f02SAnurag S. Maskey prop_name, aip->ai_val, &aip->ai_count); 3409da14cebeSEric Cheng 3410da14cebeSEric Cheng if (aip->ai_count != 0) 3411da14cebeSEric Cheng proplist->al_count++; 3412da14cebeSEric Cheng 3413da14cebeSEric Cheng return (DLADM_WALK_CONTINUE); 3414da14cebeSEric Cheng } 3415da14cebeSEric Cheng 3416da14cebeSEric Cheng 3417da14cebeSEric Cheng /* 3418da14cebeSEric Cheng * Retrieve all link properties for a link from the database and 3419da14cebeSEric Cheng * return a property list. 3420da14cebeSEric Cheng */ 3421da14cebeSEric Cheng dladm_status_t 34224ac67f02SAnurag S. Maskey dladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid, 34234ac67f02SAnurag S. Maskey dladm_arg_list_t **listp) 3424da14cebeSEric Cheng { 3425da14cebeSEric Cheng dladm_arg_list_t *list; 3426da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3427da14cebeSEric Cheng 3428da14cebeSEric Cheng list = calloc(1, sizeof (dladm_arg_list_t)); 3429da14cebeSEric Cheng if (list == NULL) 3430da14cebeSEric Cheng return (dladm_errno2status(errno)); 3431da14cebeSEric Cheng 34324ac67f02SAnurag S. Maskey status = dladm_walk_linkprop(handle, linkid, list, 34334ac67f02SAnurag S. Maskey i_dladm_get_one_prop); 3434da14cebeSEric Cheng 3435da14cebeSEric Cheng *listp = list; 3436da14cebeSEric Cheng return (status); 3437da14cebeSEric Cheng } 3438da14cebeSEric Cheng 3439da14cebeSEric Cheng /* 3440da14cebeSEric Cheng * Retrieve the named property from a proplist, check the value and 3441da14cebeSEric Cheng * convert to a kernel structure. 3442da14cebeSEric Cheng */ 3443da14cebeSEric Cheng static dladm_status_t 34444ac67f02SAnurag S. Maskey i_dladm_link_proplist_extract_one(dladm_handle_t handle, 34454ac67f02SAnurag S. Maskey dladm_arg_list_t *proplist, const char *name, void *val) 3446da14cebeSEric Cheng { 3447da14cebeSEric Cheng dladm_status_t status; 3448da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3449da14cebeSEric Cheng int i, j; 3450da14cebeSEric Cheng 3451da14cebeSEric Cheng /* Find named property in proplist */ 3452da14cebeSEric Cheng for (i = 0; i < proplist->al_count; i++) { 3453da14cebeSEric Cheng aip = &proplist->al_info[i]; 3454da14cebeSEric Cheng if (strcasecmp(aip->ai_name, name) == 0) 3455da14cebeSEric Cheng break; 3456da14cebeSEric Cheng } 3457da14cebeSEric Cheng 3458da14cebeSEric Cheng /* Property not in list */ 3459da14cebeSEric Cheng if (i == proplist->al_count) 3460da14cebeSEric Cheng return (DLADM_STATUS_OK); 3461da14cebeSEric Cheng 3462da14cebeSEric Cheng for (i = 0; i < DLADM_MAX_PROPS; i++) { 3463da14cebeSEric Cheng prop_desc_t *pdp = &prop_table[i]; 3464da14cebeSEric Cheng val_desc_t *vdp; 3465da14cebeSEric Cheng 3466da14cebeSEric Cheng vdp = malloc(sizeof (val_desc_t) * aip->ai_count); 3467da14cebeSEric Cheng if (vdp == NULL) 3468da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 3469da14cebeSEric Cheng 3470da14cebeSEric Cheng if (strcasecmp(aip->ai_name, pdp->pd_name) != 0) 3471da14cebeSEric Cheng continue; 3472da14cebeSEric Cheng 3473da14cebeSEric Cheng if (aip->ai_val == NULL) 3474da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 3475da14cebeSEric Cheng 3476da14cebeSEric Cheng /* Check property value */ 3477da14cebeSEric Cheng if (pdp->pd_check != NULL) { 34784ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, 0, aip->ai_val, 3479da14cebeSEric Cheng aip->ai_count, vdp, 0); 3480da14cebeSEric Cheng } else { 3481da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3482da14cebeSEric Cheng } 3483da14cebeSEric Cheng 3484da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3485da14cebeSEric Cheng return (status); 3486da14cebeSEric Cheng 3487da14cebeSEric Cheng for (j = 0; j < DLADM_MAX_RSRC_PROP; j++) { 3488da14cebeSEric Cheng resource_prop_t *rpp = &rsrc_prop_table[j]; 3489da14cebeSEric Cheng 3490da14cebeSEric Cheng if (strcasecmp(aip->ai_name, rpp->rp_name) != 0) 3491da14cebeSEric Cheng continue; 3492da14cebeSEric Cheng 3493da14cebeSEric Cheng /* Extract kernel structure */ 3494da14cebeSEric Cheng if (rpp->rp_extract != NULL) { 3495da14cebeSEric Cheng status = rpp->rp_extract(vdp, val, 3496da14cebeSEric Cheng aip->ai_count); 3497da14cebeSEric Cheng } else { 3498da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3499da14cebeSEric Cheng } 3500da14cebeSEric Cheng break; 3501da14cebeSEric Cheng } 3502da14cebeSEric Cheng 3503da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3504da14cebeSEric Cheng return (status); 3505da14cebeSEric Cheng 3506da14cebeSEric Cheng break; 3507da14cebeSEric Cheng } 3508da14cebeSEric Cheng return (status); 3509da14cebeSEric Cheng } 3510da14cebeSEric Cheng 3511da14cebeSEric Cheng /* 3512da14cebeSEric Cheng * Extract properties from a proplist and convert to mac_resource_props_t. 3513da14cebeSEric Cheng */ 3514da14cebeSEric Cheng dladm_status_t 35154ac67f02SAnurag S. Maskey dladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist, 3516da14cebeSEric Cheng mac_resource_props_t *mrp) 3517da14cebeSEric Cheng { 3518da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3519da14cebeSEric Cheng 35204ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "maxbw", 35214ac67f02SAnurag S. Maskey mrp); 3522da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3523da14cebeSEric Cheng return (status); 35244ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "priority", 35254ac67f02SAnurag S. Maskey mrp); 3526da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3527da14cebeSEric Cheng return (status); 35284ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "cpus", 35294ac67f02SAnurag S. Maskey mrp); 3530da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3531da14cebeSEric Cheng return (status); 3532da14cebeSEric Cheng return (status); 3533da14cebeSEric Cheng } 3534da14cebeSEric Cheng 3535da14cebeSEric Cheng static const char * 3536da14cebeSEric Cheng dladm_perm2str(uint_t perm, char *buf) 3537da14cebeSEric Cheng { 3538da14cebeSEric Cheng (void) snprintf(buf, DLADM_STRSIZE, "%c%c", 3539da14cebeSEric Cheng ((perm & MAC_PROP_PERM_READ) != 0) ? 'r' : '-', 3540da14cebeSEric Cheng ((perm & MAC_PROP_PERM_WRITE) != 0) ? 'w' : '-'); 3541da14cebeSEric Cheng return (buf); 3542da14cebeSEric Cheng } 35434784fcbdSSowmini Varadhan 35444784fcbdSSowmini Varadhan dladm_status_t 35454ac67f02SAnurag S. Maskey i_dladm_get_state(dladm_handle_t handle, datalink_id_t linkid, 35464ac67f02SAnurag S. Maskey link_state_t *state) 35474784fcbdSSowmini Varadhan { 35484784fcbdSSowmini Varadhan dld_ioc_macprop_t *dip; 35494784fcbdSSowmini Varadhan dladm_status_t status; 35504784fcbdSSowmini Varadhan uint_t perms; 35514784fcbdSSowmini Varadhan 35524ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, "state", 0, &status, 35534ac67f02SAnurag S. Maskey &perms); 35544784fcbdSSowmini Varadhan if (status != DLADM_STATUS_OK) 35554784fcbdSSowmini Varadhan return (status); 35564784fcbdSSowmini Varadhan (void) memcpy(state, dip->pr_val, sizeof (*state)); 35574784fcbdSSowmini Varadhan free(dip); 35584784fcbdSSowmini Varadhan return (status); 35594784fcbdSSowmini Varadhan } 356062ee1d25SArtem Kachitchkine 356162ee1d25SArtem Kachitchkine boolean_t 356262ee1d25SArtem Kachitchkine dladm_attr_is_linkprop(const char *name) 356362ee1d25SArtem Kachitchkine { 356462ee1d25SArtem Kachitchkine /* non-property attribute names */ 356562ee1d25SArtem Kachitchkine const char *nonprop[] = { 356662ee1d25SArtem Kachitchkine /* dlmgmtd core attributes */ 356762ee1d25SArtem Kachitchkine "name", 356862ee1d25SArtem Kachitchkine "class", 356962ee1d25SArtem Kachitchkine "media", 357062ee1d25SArtem Kachitchkine FPHYMAJ, 357162ee1d25SArtem Kachitchkine FPHYINST, 357262ee1d25SArtem Kachitchkine FDEVNAME, 357362ee1d25SArtem Kachitchkine 357462ee1d25SArtem Kachitchkine /* other attributes for vlan, aggr, etc */ 357562ee1d25SArtem Kachitchkine DLADM_ATTR_NAMES 357662ee1d25SArtem Kachitchkine }; 357762ee1d25SArtem Kachitchkine boolean_t is_nonprop = B_FALSE; 357862ee1d25SArtem Kachitchkine int i; 357962ee1d25SArtem Kachitchkine 358062ee1d25SArtem Kachitchkine for (i = 0; i < sizeof (nonprop) / sizeof (nonprop[0]); i++) { 358162ee1d25SArtem Kachitchkine if (strcmp(name, nonprop[i]) == 0) { 358262ee1d25SArtem Kachitchkine is_nonprop = B_TRUE; 358362ee1d25SArtem Kachitchkine break; 358462ee1d25SArtem Kachitchkine } 358562ee1d25SArtem Kachitchkine } 358662ee1d25SArtem Kachitchkine 358762ee1d25SArtem Kachitchkine return (!is_nonprop); 358862ee1d25SArtem Kachitchkine } 3589