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> 57*2b24ab6bSSebastien Roy #include <inet/iptun.h> 58bcb5c89dSSowmini Varadhan #include <net/wpa.h> 59bcb5c89dSSowmini Varadhan #include <sys/sysmacros.h> 604eaa4710SRishi Srivatsavai #include <sys/vlan.h> 614eaa4710SRishi Srivatsavai #include <libdlbridge.h> 624eaa4710SRishi Srivatsavai #include <stp_in.h> 63f4b3ec61Sdh155122 64d62bc4baSyz147064 /* 65d62bc4baSyz147064 * The linkprop get() callback. 66da14cebeSEric Cheng * - pd: pointer to the prop_desc_t 67d62bc4baSyz147064 * - propstrp: a property string array to keep the returned property. 68d62bc4baSyz147064 * Caller allocated. 69d62bc4baSyz147064 * - cntp: number of returned properties. 70d62bc4baSyz147064 * Caller also uses it to indicate how many it expects. 71d62bc4baSyz147064 */ 72e7801d59Ssowmini struct prop_desc; 73da14cebeSEric Cheng typedef struct prop_desc prop_desc_t; 74e7801d59Ssowmini 754ac67f02SAnurag S. Maskey typedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp, 766b9e797cSsowmini datalink_id_t, char **propstp, uint_t *cntp, 77afdda45fSVasumathi Sundaram - Sun Microsystems datalink_media_t, uint_t, uint_t *); 78f4b3ec61Sdh155122 79d62bc4baSyz147064 /* 80d62bc4baSyz147064 * The linkprop set() callback. 81d62bc4baSyz147064 * - propval: a val_desc_t array which keeps the property values to be set. 82d62bc4baSyz147064 * - cnt: number of properties to be set. 83e7801d59Ssowmini * - flags: additional flags passed down the system call. 84e7801d59Ssowmini * 85e7801d59Ssowmini * pd_set takes val_desc_t given by pd_check(), translates it into 86e7801d59Ssowmini * a format suitable for kernel consumption. This may require allocation 87e7801d59Ssowmini * of ioctl buffers etc. pd_set() may call another common routine (used 88e7801d59Ssowmini * by all other pd_sets) which invokes the ioctl. 89d62bc4baSyz147064 */ 904ac67f02SAnurag S. Maskey typedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t, 916b9e797cSsowmini val_desc_t *propval, uint_t cnt, uint_t flags, 926b9e797cSsowmini datalink_media_t); 93f4b3ec61Sdh155122 94d62bc4baSyz147064 /* 95d62bc4baSyz147064 * The linkprop check() callback. 96d62bc4baSyz147064 * - propstrp: property string array which keeps the property to be checked. 97d62bc4baSyz147064 * - cnt: number of properties. 98d62bc4baSyz147064 * - propval: return value; the property values of the given property strings. 99e7801d59Ssowmini * 100e7801d59Ssowmini * pd_check checks that the input values are valid. It does so by 101e7801d59Ssowmini * iteraring through the pd_modval list for the property. If 102e7801d59Ssowmini * the modifiable values cannot be expressed as a list, a pd_check 103e7801d59Ssowmini * specific to this property can be used. If the input values are 104e7801d59Ssowmini * verified to be valid, pd_check allocates a val_desc_t and fills it 105e7801d59Ssowmini * with either a val_desc_t found on the pd_modval list or something 106e7801d59Ssowmini * generated on the fly. 107d62bc4baSyz147064 */ 1084ac67f02SAnurag S. Maskey typedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp, 1094ac67f02SAnurag S. Maskey datalink_id_t, char **propstrp, uint_t cnt, 1104ac67f02SAnurag S. Maskey val_desc_t *propval, datalink_media_t); 111f4b3ec61Sdh155122 112bcb5c89dSSowmini Varadhan typedef struct link_attr_s { 1133fd94f8cSam223141 mac_prop_id_t pp_id; 114e7801d59Ssowmini size_t pp_valsize; 115e7801d59Ssowmini char *pp_name; 116bcb5c89dSSowmini Varadhan } link_attr_t; 117e7801d59Ssowmini 118bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t, 119bcb5c89dSSowmini Varadhan const char *, uint_t, dladm_status_t *); 120bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t, 121da14cebeSEric Cheng mac_prop_id_t, uint_t, dladm_status_t *); 1224ac67f02SAnurag S. Maskey static dld_ioc_macprop_t *i_dladm_get_public_prop(dladm_handle_t, datalink_id_t, 1234ac67f02SAnurag S. Maskey char *, uint_t, dladm_status_t *, uint_t *); 124da14cebeSEric Cheng 1253361618bSRishi Srivatsavai static dladm_status_t i_dladm_set_private_prop(dladm_handle_t, datalink_id_t, 1264ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 12762ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_get_priv_prop(dladm_handle_t, datalink_id_t, 1284ac67f02SAnurag S. Maskey const char *, char **, uint_t *, dladm_prop_type_t, 1294ac67f02SAnurag S. Maskey uint_t); 130bcb5c89dSSowmini Varadhan static link_attr_t *dladm_name2prop(const char *); 131bcb5c89dSSowmini Varadhan static link_attr_t *dladm_id2prop(mac_prop_id_t); 132da14cebeSEric Cheng 133d62bc4baSyz147064 static pd_getf_t do_get_zone, do_get_autopush, do_get_rate_mod, 134d62bc4baSyz147064 do_get_rate_prop, do_get_channel_prop, 135e7801d59Ssowmini do_get_powermode_prop, do_get_radio_prop, 1363bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_duplex_get, i_dladm_status_get, 1373bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_binary_get, i_dladm_uint32_get, 13862ee1d25SArtem Kachitchkine i_dladm_flowctl_get, i_dladm_maxbw_get, 139e75f0919SSebastien Roy i_dladm_cpus_get, i_dladm_priority_get, 1404eaa4710SRishi Srivatsavai i_dladm_tagmode_get, i_dladm_range_get, 1414eaa4710SRishi Srivatsavai get_stp_prop, get_bridge_forward, 1424eaa4710SRishi Srivatsavai get_bridge_pvid; 143da14cebeSEric Cheng 1443bc21d0aSAruna Ramakrishna - Sun Microsystems static pd_setf_t do_set_zone, do_set_rate_prop, 145e7801d59Ssowmini do_set_powermode_prop, do_set_radio_prop, 1464eaa4710SRishi Srivatsavai i_dladm_set_public_prop, do_set_res, do_set_cpus, 1474eaa4710SRishi Srivatsavai set_stp_prop, set_bridge_forward, set_bridge_pvid; 148f4b3ec61Sdh155122 149da14cebeSEric Cheng static pd_checkf_t do_check_zone, do_check_autopush, do_check_rate, 150*2b24ab6bSSebastien Roy do_check_hoplimit, do_check_encaplim, 1514eaa4710SRishi Srivatsavai i_dladm_uint32_check, do_check_maxbw, do_check_cpus, 1524eaa4710SRishi Srivatsavai do_check_priority, check_stp_prop, check_bridge_pvid; 153da14cebeSEric Cheng 1544ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_speed_get(dladm_handle_t, prop_desc_t *, 1554ac67f02SAnurag S. Maskey datalink_id_t, char **, uint_t *, uint_t, uint_t *); 1564ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t); 157da14cebeSEric Cheng static const char *dladm_perm2str(uint_t, char *); 1586b9e797cSsowmini 159da14cebeSEric Cheng struct prop_desc { 160d62bc4baSyz147064 /* 161d62bc4baSyz147064 * link property name 162d62bc4baSyz147064 */ 163f4b3ec61Sdh155122 char *pd_name; 164d62bc4baSyz147064 165d62bc4baSyz147064 /* 166d62bc4baSyz147064 * default property value, can be set to { "", NULL } 167d62bc4baSyz147064 */ 168f4b3ec61Sdh155122 val_desc_t pd_defval; 169d62bc4baSyz147064 170d62bc4baSyz147064 /* 171d62bc4baSyz147064 * list of optional property values, can be NULL. 172d62bc4baSyz147064 * 173d62bc4baSyz147064 * This is set to non-NULL if there is a list of possible property 174d62bc4baSyz147064 * values. pd_optval would point to the array of possible values. 175d62bc4baSyz147064 */ 176d62bc4baSyz147064 val_desc_t *pd_optval; 177d62bc4baSyz147064 178d62bc4baSyz147064 /* 179d62bc4baSyz147064 * count of the above optional property values. 0 if pd_optval is NULL. 180d62bc4baSyz147064 */ 181d62bc4baSyz147064 uint_t pd_noptval; 182d62bc4baSyz147064 183d62bc4baSyz147064 /* 1844eaa4710SRishi Srivatsavai * callback to set link property; set to NULL if this property is 1854eaa4710SRishi Srivatsavai * read-only and may be called before or after permanent update; see 1864eaa4710SRishi Srivatsavai * flags. 187d62bc4baSyz147064 */ 188f4b3ec61Sdh155122 pd_setf_t *pd_set; 189d62bc4baSyz147064 190d62bc4baSyz147064 /* 191d62bc4baSyz147064 * callback to get modifiable link property 192d62bc4baSyz147064 */ 193f4b3ec61Sdh155122 pd_getf_t *pd_getmod; 194d62bc4baSyz147064 195d62bc4baSyz147064 /* 196d62bc4baSyz147064 * callback to get current link property 197d62bc4baSyz147064 */ 198f4b3ec61Sdh155122 pd_getf_t *pd_get; 199d62bc4baSyz147064 200d62bc4baSyz147064 /* 201d62bc4baSyz147064 * callback to validate link property value, set to NULL if pd_optval 202d62bc4baSyz147064 * is not NULL. In that case, validate the value by comparing it with 203d62bc4baSyz147064 * the pd_optval. Return a val_desc_t array pointer if the value is 204d62bc4baSyz147064 * valid. 205d62bc4baSyz147064 */ 206f4b3ec61Sdh155122 pd_checkf_t *pd_check; 207d62bc4baSyz147064 208d62bc4baSyz147064 uint_t pd_flags; 209e7801d59Ssowmini #define PD_TEMPONLY 0x1 /* property is temporary only */ 210e7801d59Ssowmini #define PD_CHECK_ALLOC 0x2 /* alloc vd_val as part of pd_check */ 2114eaa4710SRishi Srivatsavai #define PD_AFTER_PERM 0x4 /* pd_set after db update; no temporary */ 212d62bc4baSyz147064 /* 213d62bc4baSyz147064 * indicate link classes this property applies to. 214d62bc4baSyz147064 */ 215d62bc4baSyz147064 datalink_class_t pd_class; 216d62bc4baSyz147064 217d62bc4baSyz147064 /* 218d62bc4baSyz147064 * indicate link media type this property applies to. 219d62bc4baSyz147064 */ 220d62bc4baSyz147064 datalink_media_t pd_dmedia; 221da14cebeSEric Cheng }; 222f4b3ec61Sdh155122 2233fd94f8cSam223141 #define MAC_PROP_BUFSIZE(v) sizeof (dld_ioc_macprop_t) + (v) - 1 224e7801d59Ssowmini 225bcb5c89dSSowmini Varadhan /* 226bcb5c89dSSowmini Varadhan * Supported link properties enumerated in the prop_table[] array are 227bcb5c89dSSowmini Varadhan * computed using the callback functions in that array. To compute the 228bcb5c89dSSowmini Varadhan * property value, multiple distinct system calls may be needed (e.g., 229bcb5c89dSSowmini Varadhan * for wifi speed, we need to issue system calls to get desired/supported 230bcb5c89dSSowmini Varadhan * rates). The link_attr[] table enumerates the interfaces to the kernel, 231bcb5c89dSSowmini Varadhan * and the type/size of the data passed in the user-kernel interface. 232bcb5c89dSSowmini Varadhan */ 233bcb5c89dSSowmini Varadhan static link_attr_t link_attr[] = { 234bcb5c89dSSowmini Varadhan { MAC_PROP_DUPLEX, sizeof (link_duplex_t), "duplex"}, 235e7801d59Ssowmini 236bcb5c89dSSowmini Varadhan { MAC_PROP_SPEED, sizeof (uint64_t), "speed"}, 237e7801d59Ssowmini 238bcb5c89dSSowmini Varadhan { MAC_PROP_STATUS, sizeof (link_state_t), "state"}, 239e7801d59Ssowmini 240bcb5c89dSSowmini Varadhan { MAC_PROP_AUTONEG, sizeof (uint8_t), "adv_autoneg_cap"}, 241e7801d59Ssowmini 242bcb5c89dSSowmini Varadhan { MAC_PROP_MTU, sizeof (uint32_t), "mtu"}, 243e7801d59Ssowmini 244bcb5c89dSSowmini Varadhan { MAC_PROP_FLOWCTRL, sizeof (link_flowctrl_t), "flowctrl"}, 245e7801d59Ssowmini 246bcb5c89dSSowmini Varadhan { MAC_PROP_ZONE, sizeof (dld_ioc_zid_t), "zone"}, 247e7801d59Ssowmini 248bcb5c89dSSowmini Varadhan { MAC_PROP_AUTOPUSH, sizeof (struct dlautopush), "autopush"}, 2493bc21d0aSAruna Ramakrishna - Sun Microsystems 250aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_ADV_10GFDX_CAP, sizeof (uint8_t), "adv_10gfdx_cap"}, 251aca118b7Slucy wang - Sun Microsystems - Beijing China 252aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_EN_10GFDX_CAP, sizeof (uint8_t), "en_10gfdx_cap"}, 253aca118b7Slucy wang - Sun Microsystems - Beijing China 254bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000FDX_CAP, sizeof (uint8_t), "adv_1000fdx_cap"}, 2553bc21d0aSAruna Ramakrishna - Sun Microsystems 256bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000FDX_CAP, sizeof (uint8_t), "en_1000fdx_cap"}, 257e7801d59Ssowmini 258bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000HDX_CAP, sizeof (uint8_t), "adv_1000hdx_cap"}, 259e7801d59Ssowmini 260bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000HDX_CAP, sizeof (uint8_t), "en_1000hdx_cap"}, 261e7801d59Ssowmini 262bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100FDX_CAP, sizeof (uint8_t), "adv_100fdx_cap"}, 263e7801d59Ssowmini 264bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100FDX_CAP, sizeof (uint8_t), "en_100fdx_cap"}, 265e7801d59Ssowmini 266bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100HDX_CAP, sizeof (uint8_t), "adv_100hdx_cap"}, 267e7801d59Ssowmini 268bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100HDX_CAP, sizeof (uint8_t), "en_100hdx_cap"}, 269e7801d59Ssowmini 270bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10FDX_CAP, sizeof (uint8_t), "adv_10fdx_cap"}, 271e7801d59Ssowmini 272bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10FDX_CAP, sizeof (uint8_t), "en_10fdx_cap"}, 273e7801d59Ssowmini 274bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10HDX_CAP, sizeof (uint8_t), "adv_10hdx_cap"}, 275e7801d59Ssowmini 276bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10HDX_CAP, sizeof (uint8_t), "en_10hdx_cap"}, 277e7801d59Ssowmini 278bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESSID, sizeof (wl_linkstatus_t), "essid"}, 279e7801d59Ssowmini 280bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSID, sizeof (wl_bssid_t), "bssid"}, 281bcb5c89dSSowmini Varadhan 282bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSTYPE, sizeof (wl_bss_type_t), "bsstype"}, 283bcb5c89dSSowmini Varadhan 284bcb5c89dSSowmini Varadhan { MAC_PROP_WL_LINKSTATUS, sizeof (wl_linkstatus_t), "wl_linkstatus"}, 285bcb5c89dSSowmini Varadhan 286bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 287bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DESIRED_RATES, sizeof (wl_rates_t), "desired_rates"}, 288bcb5c89dSSowmini Varadhan 289bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 290bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SUPPORTED_RATES, sizeof (wl_rates_t), "supported_rates"}, 291bcb5c89dSSowmini Varadhan 292bcb5c89dSSowmini Varadhan { MAC_PROP_WL_AUTH_MODE, sizeof (wl_authmode_t), "authmode"}, 293bcb5c89dSSowmini Varadhan 294bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ENCRYPTION, sizeof (wl_encryption_t), "encryption"}, 295bcb5c89dSSowmini Varadhan 296bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RSSI, sizeof (wl_rssi_t), "signal"}, 297bcb5c89dSSowmini Varadhan 298bcb5c89dSSowmini Varadhan { MAC_PROP_WL_PHY_CONFIG, sizeof (wl_phy_conf_t), "phy_conf"}, 299bcb5c89dSSowmini Varadhan 300bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CAPABILITY, sizeof (wl_capability_t), "capability"}, 301bcb5c89dSSowmini Varadhan 302bcb5c89dSSowmini Varadhan { MAC_PROP_WL_WPA, sizeof (wl_wpa_t), "wpa"}, 303bcb5c89dSSowmini Varadhan 304bcb5c89dSSowmini Varadhan /* wl_wpa_ess_t has variable length */ 305bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SCANRESULTS, sizeof (wl_wpa_ess_t), "scan_results"}, 306bcb5c89dSSowmini Varadhan 307bcb5c89dSSowmini Varadhan { MAC_PROP_WL_POWER_MODE, sizeof (wl_ps_mode_t), "powermode"}, 308bcb5c89dSSowmini Varadhan 309bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RADIO, sizeof (dladm_wlan_radio_t), "wl_radio"}, 310bcb5c89dSSowmini Varadhan 311bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESS_LIST, sizeof (wl_ess_list_t), "wl_ess_list"}, 312bcb5c89dSSowmini Varadhan 313bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY_TAB, sizeof (wl_wep_key_tab_t), "wl_wep_key"}, 314bcb5c89dSSowmini Varadhan 315bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CREATE_IBSS, sizeof (wl_create_ibss_t), "createibss"}, 316bcb5c89dSSowmini Varadhan 317bcb5c89dSSowmini Varadhan /* wl_wpa_ie_t has variable length */ 318bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SETOPTIE, sizeof (wl_wpa_ie_t), "set_ie"}, 319bcb5c89dSSowmini Varadhan 320bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DELKEY, sizeof (wl_del_key_t), "wpa_del_key"}, 321bcb5c89dSSowmini Varadhan 322bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY, sizeof (wl_key_t), "wl_key"}, 323bcb5c89dSSowmini Varadhan 324bcb5c89dSSowmini Varadhan { MAC_PROP_WL_MLME, sizeof (wl_mlme_t), "mlme"}, 325bcb5c89dSSowmini Varadhan 326da14cebeSEric Cheng { MAC_PROP_MAXBW, sizeof (mac_resource_props_t), "maxbw"}, 327da14cebeSEric Cheng 328da14cebeSEric Cheng { MAC_PROP_PRIO, sizeof (mac_resource_props_t), "priority"}, 329da14cebeSEric Cheng 330da14cebeSEric Cheng { MAC_PROP_BIND_CPU, sizeof (mac_resource_props_t), "cpus"}, 331da14cebeSEric Cheng 332e75f0919SSebastien Roy { MAC_PROP_TAGMODE, sizeof (link_tagmode_t), "tagmode"}, 333e75f0919SSebastien Roy 334*2b24ab6bSSebastien Roy { MAC_PROP_IPTUN_HOPLIMIT, sizeof (uint32_t), "hoplimit"}, 335*2b24ab6bSSebastien Roy 336*2b24ab6bSSebastien Roy { MAC_PROP_IPTUN_ENCAPLIMIT, sizeof (uint32_t), "encaplimit"}, 337*2b24ab6bSSebastien Roy 3384eaa4710SRishi Srivatsavai { MAC_PROP_PVID, sizeof (uint16_t), "default_tag"}, 3394eaa4710SRishi Srivatsavai 3404eaa4710SRishi Srivatsavai { MAC_PROP_LLIMIT, sizeof (uint32_t), "learn_limit"}, 3414eaa4710SRishi Srivatsavai 3424eaa4710SRishi Srivatsavai { MAC_PROP_LDECAY, sizeof (uint32_t), "learn_decay"}, 3434eaa4710SRishi Srivatsavai 344bcb5c89dSSowmini Varadhan { MAC_PROP_PRIVATE, 0, "driver-private"} 345da14cebeSEric Cheng 346e7801d59Ssowmini }; 347e7801d59Ssowmini 3484eaa4710SRishi Srivatsavai typedef struct bridge_public_prop_s { 3494eaa4710SRishi Srivatsavai const char *bpp_name; 3504eaa4710SRishi Srivatsavai int bpp_code; 3514eaa4710SRishi Srivatsavai } bridge_public_prop_t; 3524eaa4710SRishi Srivatsavai 3534eaa4710SRishi Srivatsavai static const bridge_public_prop_t bridge_prop[] = { 3544eaa4710SRishi Srivatsavai { "stp", PT_CFG_NON_STP }, 3554eaa4710SRishi Srivatsavai { "stp_priority", PT_CFG_PRIO }, 3564eaa4710SRishi Srivatsavai { "stp_cost", PT_CFG_COST }, 3574eaa4710SRishi Srivatsavai { "stp_edge", PT_CFG_EDGE }, 3584eaa4710SRishi Srivatsavai { "stp_p2p", PT_CFG_P2P }, 3594eaa4710SRishi Srivatsavai { "stp_mcheck", PT_CFG_MCHECK }, 3604eaa4710SRishi Srivatsavai { NULL, 0 } 3614eaa4710SRishi Srivatsavai }; 3624eaa4710SRishi Srivatsavai 363e7801d59Ssowmini static val_desc_t link_duplex_vals[] = { 364e7801d59Ssowmini { "half", LINK_DUPLEX_HALF }, 365e7801d59Ssowmini { "full", LINK_DUPLEX_HALF } 366e7801d59Ssowmini }; 367e7801d59Ssowmini static val_desc_t link_status_vals[] = { 368e7801d59Ssowmini { "up", LINK_STATE_UP }, 369e7801d59Ssowmini { "down", LINK_STATE_DOWN } 370e7801d59Ssowmini }; 371e7801d59Ssowmini static val_desc_t link_01_vals[] = { 372e7801d59Ssowmini { "1", 1 }, 373e7801d59Ssowmini { "0", 0 } 374e7801d59Ssowmini }; 375e7801d59Ssowmini static val_desc_t link_flow_vals[] = { 376e7801d59Ssowmini { "no", LINK_FLOWCTRL_NONE }, 377e7801d59Ssowmini { "tx", LINK_FLOWCTRL_TX }, 378e7801d59Ssowmini { "rx", LINK_FLOWCTRL_RX }, 379e7801d59Ssowmini { "bi", LINK_FLOWCTRL_BI } 380e7801d59Ssowmini }; 381da14cebeSEric Cheng static val_desc_t link_priority_vals[] = { 382da14cebeSEric Cheng { "low", MPL_LOW }, 383da14cebeSEric Cheng { "medium", MPL_MEDIUM }, 384da14cebeSEric Cheng { "high", MPL_HIGH } 385da14cebeSEric Cheng }; 386e7801d59Ssowmini 387e75f0919SSebastien Roy static val_desc_t link_tagmode_vals[] = { 388e75f0919SSebastien Roy { "normal", LINK_TAGMODE_NORMAL }, 389e75f0919SSebastien Roy { "vlanonly", LINK_TAGMODE_VLANONLY } 390e75f0919SSebastien Roy }; 391e75f0919SSebastien Roy 392d62bc4baSyz147064 static val_desc_t dladm_wlan_radio_vals[] = { 393d62bc4baSyz147064 { "on", DLADM_WLAN_RADIO_ON }, 394d62bc4baSyz147064 { "off", DLADM_WLAN_RADIO_OFF } 395d62bc4baSyz147064 }; 396d62bc4baSyz147064 397d62bc4baSyz147064 static val_desc_t dladm_wlan_powermode_vals[] = { 398d62bc4baSyz147064 { "off", DLADM_WLAN_PM_OFF }, 399d62bc4baSyz147064 { "fast", DLADM_WLAN_PM_FAST }, 400d62bc4baSyz147064 { "max", DLADM_WLAN_PM_MAX } 401d62bc4baSyz147064 }; 402d62bc4baSyz147064 4034eaa4710SRishi Srivatsavai static val_desc_t stp_p2p_vals[] = { 4044eaa4710SRishi Srivatsavai { "true", P2P_FORCE_TRUE }, 4054eaa4710SRishi Srivatsavai { "false", P2P_FORCE_FALSE }, 4064eaa4710SRishi Srivatsavai { "auto", P2P_AUTO } 4074eaa4710SRishi Srivatsavai }; 4084eaa4710SRishi Srivatsavai 409da14cebeSEric Cheng #define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) 410da14cebeSEric Cheng #define RESET_VAL ((uintptr_t)-1) 411d62bc4baSyz147064 412da14cebeSEric Cheng static prop_desc_t prop_table[] = { 413e7801d59Ssowmini { "channel", { NULL, 0 }, 414e7801d59Ssowmini NULL, 0, NULL, NULL, 415d62bc4baSyz147064 do_get_channel_prop, NULL, 0, 416d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 417d62bc4baSyz147064 418d62bc4baSyz147064 { "powermode", { "off", DLADM_WLAN_PM_OFF }, 419d62bc4baSyz147064 dladm_wlan_powermode_vals, VALCNT(dladm_wlan_powermode_vals), 420d62bc4baSyz147064 do_set_powermode_prop, NULL, 421d62bc4baSyz147064 do_get_powermode_prop, NULL, 0, 422d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 423d62bc4baSyz147064 424d62bc4baSyz147064 { "radio", { "on", DLADM_WLAN_RADIO_ON }, 425d62bc4baSyz147064 dladm_wlan_radio_vals, VALCNT(dladm_wlan_radio_vals), 426d62bc4baSyz147064 do_set_radio_prop, NULL, 427d62bc4baSyz147064 do_get_radio_prop, NULL, 0, 428d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 429d62bc4baSyz147064 430d62bc4baSyz147064 { "speed", { "", 0 }, NULL, 0, 431d62bc4baSyz147064 do_set_rate_prop, do_get_rate_mod, 432d62bc4baSyz147064 do_get_rate_prop, do_check_rate, 0, 4336b9e797cSsowmini DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE }, 434d62bc4baSyz147064 4354045d941Ssowmini { "autopush", { "", 0 }, NULL, 0, 4363bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, 4373bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_autopush, do_check_autopush, PD_CHECK_ALLOC, 438d62bc4baSyz147064 DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 439d62bc4baSyz147064 4404045d941Ssowmini { "zone", { "", 0 }, NULL, 0, 441f4b3ec61Sdh155122 do_set_zone, NULL, 4423bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_zone, do_check_zone, PD_TEMPONLY|PD_CHECK_ALLOC, 443e7801d59Ssowmini DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 444e7801d59Ssowmini 4454045d941Ssowmini { "duplex", { "", 0 }, 446e7801d59Ssowmini link_duplex_vals, VALCNT(link_duplex_vals), 4473bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_duplex_get, NULL, 448e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 449e7801d59Ssowmini 4506b9e797cSsowmini { "state", { "up", LINK_STATE_UP }, 451e7801d59Ssowmini link_status_vals, VALCNT(link_status_vals), 4523bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_status_get, NULL, 4534045d941Ssowmini 0, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 454e7801d59Ssowmini 4550b8f0546SSowmini Varadhan { "adv_autoneg_cap", { "", 0 }, 456e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4573bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 458e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 459e7801d59Ssowmini 4604045d941Ssowmini { "mtu", { "", 0 }, NULL, 0, 461f0f2c3a5SGirish Moodalbail i_dladm_set_public_prop, i_dladm_range_get, 4624eaa4710SRishi Srivatsavai i_dladm_uint32_get, i_dladm_uint32_check, 0, DATALINK_CLASS_ALL, 4633bc21d0aSAruna Ramakrishna - Sun Microsystems DATALINK_ANY_MEDIATYPE }, 464e7801d59Ssowmini 4654045d941Ssowmini { "flowctrl", { "", 0 }, 466e7801d59Ssowmini link_flow_vals, VALCNT(link_flow_vals), 4673bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_flowctl_get, NULL, 468e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 469e7801d59Ssowmini 470aca118b7Slucy wang - Sun Microsystems - Beijing China { "adv_10gfdx_cap", { "", 0 }, 471aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 472aca118b7Slucy wang - Sun Microsystems - Beijing China NULL, NULL, i_dladm_binary_get, NULL, 473aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 474aca118b7Slucy wang - Sun Microsystems - Beijing China 475aca118b7Slucy wang - Sun Microsystems - Beijing China { "en_10gfdx_cap", { "", 0 }, 476aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 477aca118b7Slucy wang - Sun Microsystems - Beijing China i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 478aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 479aca118b7Slucy wang - Sun Microsystems - Beijing China 4804045d941Ssowmini { "adv_1000fdx_cap", { "", 0 }, 4814045d941Ssowmini link_01_vals, VALCNT(link_01_vals), 4823bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 483e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 484e7801d59Ssowmini 4854045d941Ssowmini { "en_1000fdx_cap", { "", 0 }, 486e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4873bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 488e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 489e7801d59Ssowmini 4904045d941Ssowmini { "adv_1000hdx_cap", { "", 0 }, 491e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4923bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 493e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 494e7801d59Ssowmini 4954045d941Ssowmini { "en_1000hdx_cap", { "", 0 }, 496e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4973bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 498e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 499e7801d59Ssowmini 5004045d941Ssowmini { "adv_100fdx_cap", { "", 0 }, 501e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5023bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 503e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 504e7801d59Ssowmini 5054045d941Ssowmini { "en_100fdx_cap", { "", 0 }, 506e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5073bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 508e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 509e7801d59Ssowmini 5104045d941Ssowmini { "adv_100hdx_cap", { "", 0 }, 511e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5123bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 513e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 514e7801d59Ssowmini 5154045d941Ssowmini { "en_100hdx_cap", { "", 0 }, 516e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5173bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 518e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 519e7801d59Ssowmini 5204045d941Ssowmini { "adv_10fdx_cap", { "", 0 }, 521e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5223bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 523e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 524e7801d59Ssowmini 5254045d941Ssowmini { "en_10fdx_cap", { "", 0 }, 526e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5273bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 528e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 529e7801d59Ssowmini 5304045d941Ssowmini { "adv_10hdx_cap", { "", 0 }, 531e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5323bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 533e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 534e7801d59Ssowmini 5354045d941Ssowmini { "en_10hdx_cap", { "", 0 }, 536e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5373bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 538da14cebeSEric Cheng 0, DATALINK_CLASS_PHYS, DL_ETHER }, 539e7801d59Ssowmini 540da14cebeSEric Cheng { "maxbw", { "--", RESET_VAL }, NULL, 0, 541da14cebeSEric Cheng do_set_res, NULL, 54262ee1d25SArtem Kachitchkine i_dladm_maxbw_get, do_check_maxbw, PD_CHECK_ALLOC, 543da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 544da14cebeSEric Cheng 545da14cebeSEric Cheng { "cpus", { "--", RESET_VAL }, NULL, 0, 546da14cebeSEric Cheng do_set_cpus, NULL, 54762ee1d25SArtem Kachitchkine i_dladm_cpus_get, do_check_cpus, 0, 548da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 549da14cebeSEric Cheng 550da14cebeSEric Cheng { "priority", { "high", RESET_VAL }, 551da14cebeSEric Cheng link_priority_vals, VALCNT(link_priority_vals), do_set_res, NULL, 55262ee1d25SArtem Kachitchkine i_dladm_priority_get, do_check_priority, PD_CHECK_ALLOC, 553da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 554e75f0919SSebastien Roy 555e75f0919SSebastien Roy { "tagmode", { "vlanonly", LINK_TAGMODE_VLANONLY }, 556e75f0919SSebastien Roy link_tagmode_vals, VALCNT(link_tagmode_vals), 557e75f0919SSebastien Roy i_dladm_set_public_prop, NULL, i_dladm_tagmode_get, 558e75f0919SSebastien Roy NULL, 0, 559e75f0919SSebastien Roy DATALINK_CLASS_PHYS | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC, 5604eaa4710SRishi Srivatsavai DL_ETHER }, 5614eaa4710SRishi Srivatsavai 562*2b24ab6bSSebastien Roy { "hoplimit", { "", 0 }, NULL, 0, 563*2b24ab6bSSebastien Roy i_dladm_set_public_prop, i_dladm_range_get, i_dladm_uint32_get, 564*2b24ab6bSSebastien Roy do_check_hoplimit, 0, DATALINK_CLASS_IPTUN, DATALINK_ANY_MEDIATYPE}, 565*2b24ab6bSSebastien Roy 566*2b24ab6bSSebastien Roy { "encaplimit", { "", 0 }, NULL, 0, 567*2b24ab6bSSebastien Roy i_dladm_set_public_prop, i_dladm_range_get, i_dladm_uint32_get, 568*2b24ab6bSSebastien Roy do_check_encaplim, 0, DATALINK_CLASS_IPTUN, DL_IPV6}, 569*2b24ab6bSSebastien Roy 5704eaa4710SRishi Srivatsavai { "forward", { "1", 1 }, 5714eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 5724eaa4710SRishi Srivatsavai set_bridge_forward, NULL, get_bridge_forward, NULL, PD_AFTER_PERM, 5734eaa4710SRishi Srivatsavai DATALINK_CLASS_ALL & ~DATALINK_CLASS_VNIC, DL_ETHER }, 5744eaa4710SRishi Srivatsavai 5754eaa4710SRishi Srivatsavai { "default_tag", { "1", 1 }, NULL, 0, 5764eaa4710SRishi Srivatsavai set_bridge_pvid, NULL, get_bridge_pvid, check_bridge_pvid, 5774eaa4710SRishi Srivatsavai 0, DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5784eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5794eaa4710SRishi Srivatsavai 5804eaa4710SRishi Srivatsavai { "learn_limit", { "1000", 1000 }, NULL, 0, 5814eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 5824eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 5834eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5844eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5854eaa4710SRishi Srivatsavai 5864eaa4710SRishi Srivatsavai { "learn_decay", { "200", 200 }, NULL, 0, 5874eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 5884eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 5894eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5904eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5914eaa4710SRishi Srivatsavai 5924eaa4710SRishi Srivatsavai { "stp", { "1", 1 }, 5934eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 5944eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 5954eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5964eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5974eaa4710SRishi Srivatsavai 5984eaa4710SRishi Srivatsavai { "stp_priority", { "128", 128 }, NULL, 0, 5994eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6004eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6014eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6024eaa4710SRishi Srivatsavai 6034eaa4710SRishi Srivatsavai { "stp_cost", { "auto", 0 }, NULL, 0, 6044eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6054eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6064eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6074eaa4710SRishi Srivatsavai 6084eaa4710SRishi Srivatsavai { "stp_edge", { "1", 1 }, 6094eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 6104eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 6114eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6124eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6134eaa4710SRishi Srivatsavai 6144eaa4710SRishi Srivatsavai { "stp_p2p", { "auto", P2P_AUTO }, 6154eaa4710SRishi Srivatsavai stp_p2p_vals, VALCNT(stp_p2p_vals), 6164eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 6174eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6184eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6194eaa4710SRishi Srivatsavai 6204eaa4710SRishi Srivatsavai { "stp_mcheck", { "0", 0 }, 6214eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 6224eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6234eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6244eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 625f4b3ec61Sdh155122 }; 626f4b3ec61Sdh155122 627d62bc4baSyz147064 #define DLADM_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t)) 6280ba2cbe9Sxc151355 629da14cebeSEric Cheng static resource_prop_t rsrc_prop_table[] = { 630da14cebeSEric Cheng {"maxbw", do_extract_maxbw}, 631da14cebeSEric Cheng {"priority", do_extract_priority}, 632da14cebeSEric Cheng {"cpus", do_extract_cpus} 633da14cebeSEric Cheng }; 634da14cebeSEric Cheng #define DLADM_MAX_RSRC_PROP (sizeof (rsrc_prop_table) / \ 635da14cebeSEric Cheng sizeof (resource_prop_t)) 636da14cebeSEric Cheng 637bcb5c89dSSowmini Varadhan /* 638bcb5c89dSSowmini Varadhan * when retrieving private properties, we pass down a buffer with 639bcb5c89dSSowmini Varadhan * DLADM_PROP_BUF_CHUNK of space for the driver to return the property value. 640bcb5c89dSSowmini Varadhan */ 641bcb5c89dSSowmini Varadhan #define DLADM_PROP_BUF_CHUNK 1024 642bcb5c89dSSowmini Varadhan 6434ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t, 6444ac67f02SAnurag S. Maskey const char *, char **, uint_t); 6454ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t, 6464ac67f02SAnurag S. Maskey const char *, char **, uint_t *); 64762ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_walk_linkprop_priv_db(dladm_handle_t, 64862ee1d25SArtem Kachitchkine datalink_id_t, void *, int (*)(dladm_handle_t, 64962ee1d25SArtem Kachitchkine datalink_id_t, const char *, void *)); 6504ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t, 6514ac67f02SAnurag S. Maskey datalink_class_t, uint32_t, prop_desc_t *, char **, 6524ac67f02SAnurag S. Maskey uint_t, uint_t); 6534ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t, 6544ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 6554ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *, 6564ac67f02SAnurag S. Maskey datalink_id_t, datalink_media_t, uint_t); 657da14cebeSEric Cheng 658d62bc4baSyz147064 /* 659d62bc4baSyz147064 * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all 660d62bc4baSyz147064 * rates to be retrieved. However, we cannot increase it at this 661d62bc4baSyz147064 * time because it will break binary compatibility with unbundled 662d62bc4baSyz147064 * WiFi drivers and utilities. So for now we define an additional 663d62bc4baSyz147064 * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved. 664d62bc4baSyz147064 */ 665d62bc4baSyz147064 #define MAX_SUPPORT_RATES 64 666d62bc4baSyz147064 667d62bc4baSyz147064 #define AP_ANCHOR "[anchor]" 668d62bc4baSyz147064 #define AP_DELIMITER '.' 669d62bc4baSyz147064 670d62bc4baSyz147064 static dladm_status_t 671d62bc4baSyz147064 do_check_prop(prop_desc_t *pdp, char **prop_val, uint_t val_cnt, 672d62bc4baSyz147064 val_desc_t *vdp) 6730ba2cbe9Sxc151355 { 674d62bc4baSyz147064 int i, j; 6750ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 6760ba2cbe9Sxc151355 677d62bc4baSyz147064 for (j = 0; j < val_cnt; j++) { 678d62bc4baSyz147064 for (i = 0; i < pdp->pd_noptval; i++) { 679d62bc4baSyz147064 if (strcasecmp(*prop_val, 680d62bc4baSyz147064 pdp->pd_optval[i].vd_name) == 0) { 6810ba2cbe9Sxc151355 break; 6820ba2cbe9Sxc151355 } 6830ba2cbe9Sxc151355 } 684d62bc4baSyz147064 if (i == pdp->pd_noptval) { 685d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 686d62bc4baSyz147064 goto done; 687d62bc4baSyz147064 } 688d62bc4baSyz147064 (void) memcpy(vdp + j, &pdp->pd_optval[i], sizeof (val_desc_t)); 6890ba2cbe9Sxc151355 } 6900ba2cbe9Sxc151355 691d62bc4baSyz147064 done: 692d62bc4baSyz147064 return (status); 6930ba2cbe9Sxc151355 } 6940ba2cbe9Sxc151355 6950ba2cbe9Sxc151355 static dladm_status_t 6964ac67f02SAnurag S. Maskey i_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid, 6974ac67f02SAnurag S. Maskey datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val, 6984ac67f02SAnurag S. Maskey uint_t val_cnt, uint_t flags) 6990ba2cbe9Sxc151355 { 7000ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 701d62bc4baSyz147064 val_desc_t *vdp = NULL; 702d62bc4baSyz147064 boolean_t needfree = B_FALSE; 703d62bc4baSyz147064 uint_t cnt, i; 7040ba2cbe9Sxc151355 705d62bc4baSyz147064 if (!(pdp->pd_class & class)) 706d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 7070ba2cbe9Sxc151355 708d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 709d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 710d62bc4baSyz147064 711d62bc4baSyz147064 if ((flags & DLADM_OPT_PERSIST) && (pdp->pd_flags & PD_TEMPONLY)) 712d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 713d62bc4baSyz147064 714d62bc4baSyz147064 if (!(flags & DLADM_OPT_ACTIVE)) 715d62bc4baSyz147064 return (DLADM_STATUS_OK); 716d62bc4baSyz147064 717d62bc4baSyz147064 if (pdp->pd_set == NULL) 718d62bc4baSyz147064 return (DLADM_STATUS_PROPRDONLY); 719d62bc4baSyz147064 720d62bc4baSyz147064 if (prop_val != NULL) { 721d62bc4baSyz147064 vdp = malloc(sizeof (val_desc_t) * val_cnt); 722d62bc4baSyz147064 if (vdp == NULL) 723d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 724d62bc4baSyz147064 725d62bc4baSyz147064 if (pdp->pd_check != NULL) { 726da14cebeSEric Cheng needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0); 7274ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, prop_val, 7284ac67f02SAnurag S. Maskey val_cnt, vdp, media); 729d62bc4baSyz147064 } else if (pdp->pd_optval != NULL) { 730d62bc4baSyz147064 status = do_check_prop(pdp, prop_val, val_cnt, vdp); 731d62bc4baSyz147064 } else { 732d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 7330ba2cbe9Sxc151355 } 7340ba2cbe9Sxc151355 735d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 736d62bc4baSyz147064 goto done; 737d62bc4baSyz147064 738d62bc4baSyz147064 cnt = val_cnt; 739d62bc4baSyz147064 } else { 740da14cebeSEric Cheng boolean_t defval = B_FALSE; 741da14cebeSEric Cheng 742d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) 743d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 744d62bc4baSyz147064 7453bc21d0aSAruna Ramakrishna - Sun Microsystems cnt = 1; 746da14cebeSEric Cheng defval = (strlen(pdp->pd_defval.vd_name) > 0); 747da14cebeSEric Cheng if ((pdp->pd_flags & PD_CHECK_ALLOC) != 0 || defval) { 748d62bc4baSyz147064 if ((vdp = malloc(sizeof (val_desc_t))) == NULL) 749d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 7503bc21d0aSAruna Ramakrishna - Sun Microsystems 751da14cebeSEric Cheng if (defval) { 752da14cebeSEric Cheng (void) memcpy(vdp, &pdp->pd_defval, 753da14cebeSEric Cheng sizeof (val_desc_t)); 754da14cebeSEric Cheng } else if (pdp->pd_check != NULL) { 7554ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, 7564ac67f02SAnurag S. Maskey prop_val, cnt, vdp, media); 7573bc21d0aSAruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK) 7583bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 7593bc21d0aSAruna Ramakrishna - Sun Microsystems } 7604045d941Ssowmini } else { 7614ac67f02SAnurag S. Maskey status = i_dladm_getset_defval(handle, pdp, linkid, 7624045d941Ssowmini media, flags); 7634045d941Ssowmini return (status); 7644045d941Ssowmini } 765d62bc4baSyz147064 } 7664eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_AFTER_PERM) 7674eaa4710SRishi Srivatsavai status = (flags & DLADM_OPT_PERSIST) ? DLADM_STATUS_OK : 7684eaa4710SRishi Srivatsavai DLADM_STATUS_PERMONLY; 7694eaa4710SRishi Srivatsavai else 7704eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags, 7714eaa4710SRishi Srivatsavai media); 772d62bc4baSyz147064 if (needfree) { 773d62bc4baSyz147064 for (i = 0; i < cnt; i++) 774e7801d59Ssowmini free((void *)((val_desc_t *)vdp + i)->vd_val); 775d62bc4baSyz147064 } 776d62bc4baSyz147064 done: 777d62bc4baSyz147064 free(vdp); 778d62bc4baSyz147064 return (status); 779d62bc4baSyz147064 } 780d62bc4baSyz147064 781d62bc4baSyz147064 static dladm_status_t 7824ac67f02SAnurag S. Maskey i_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 7834ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 784d62bc4baSyz147064 { 785d62bc4baSyz147064 int i; 786d62bc4baSyz147064 boolean_t found = B_FALSE; 787d62bc4baSyz147064 datalink_class_t class; 788d62bc4baSyz147064 uint32_t media; 789d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 790d62bc4baSyz147064 7914ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 7924ac67f02SAnurag S. Maskey NULL, 0); 793d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 7940ba2cbe9Sxc151355 return (status); 7950ba2cbe9Sxc151355 796d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 797d62bc4baSyz147064 prop_desc_t *pdp = &prop_table[i]; 798d62bc4baSyz147064 dladm_status_t s; 7990ba2cbe9Sxc151355 800d62bc4baSyz147064 if (prop_name != NULL && 801d62bc4baSyz147064 (strcasecmp(prop_name, pdp->pd_name) != 0)) 802d62bc4baSyz147064 continue; 803d62bc4baSyz147064 found = B_TRUE; 8044ac67f02SAnurag S. Maskey s = i_dladm_set_single_prop(handle, linkid, class, media, pdp, 8054ac67f02SAnurag S. Maskey prop_val, val_cnt, flags); 806d62bc4baSyz147064 807d62bc4baSyz147064 if (prop_name != NULL) { 808d62bc4baSyz147064 status = s; 809d62bc4baSyz147064 break; 810d62bc4baSyz147064 } else { 811d62bc4baSyz147064 if (s != DLADM_STATUS_OK && 812d62bc4baSyz147064 s != DLADM_STATUS_NOTSUP) 813d62bc4baSyz147064 status = s; 814d62bc4baSyz147064 } 815d62bc4baSyz147064 } 816e7801d59Ssowmini if (!found) { 817e7801d59Ssowmini if (prop_name[0] == '_') { 818e7801d59Ssowmini /* other private properties */ 8193361618bSRishi Srivatsavai status = i_dladm_set_private_prop(handle, linkid, 8203361618bSRishi Srivatsavai prop_name, prop_val, val_cnt, flags); 821e7801d59Ssowmini } else { 8220ba2cbe9Sxc151355 status = DLADM_STATUS_NOTFOUND; 823e7801d59Ssowmini } 824e7801d59Ssowmini } 8250ba2cbe9Sxc151355 8260ba2cbe9Sxc151355 return (status); 8270ba2cbe9Sxc151355 } 8280ba2cbe9Sxc151355 829d62bc4baSyz147064 /* 830d62bc4baSyz147064 * Set/reset link property for specific link 831d62bc4baSyz147064 */ 832d62bc4baSyz147064 dladm_status_t 8334ac67f02SAnurag S. Maskey dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 8344ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 8350ba2cbe9Sxc151355 { 836d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 8370ba2cbe9Sxc151355 838d62bc4baSyz147064 if ((linkid == DATALINK_INVALID_LINKID) || (flags == 0) || 839d62bc4baSyz147064 (prop_val == NULL && val_cnt > 0) || 840d62bc4baSyz147064 (prop_val != NULL && val_cnt == 0) || 841d62bc4baSyz147064 (prop_name == NULL && prop_val != NULL)) { 842d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 8430ba2cbe9Sxc151355 } 8440ba2cbe9Sxc151355 8453361618bSRishi Srivatsavai /* 8463361618bSRishi Srivatsavai * Check for valid link property against the flags passed 8473361618bSRishi Srivatsavai * and set the link property when active flag is passed. 8483361618bSRishi Srivatsavai */ 8494ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val, 850d62bc4baSyz147064 val_cnt, flags); 851d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 852d62bc4baSyz147064 return (status); 853d62bc4baSyz147064 854d62bc4baSyz147064 if (flags & DLADM_OPT_PERSIST) { 8554ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop_db(handle, linkid, prop_name, 856d62bc4baSyz147064 prop_val, val_cnt); 8574eaa4710SRishi Srivatsavai 8584eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK && (flags & DLADM_OPT_ACTIVE)) { 8594eaa4710SRishi Srivatsavai prop_desc_t *pdp = prop_table; 8604eaa4710SRishi Srivatsavai int i; 8614eaa4710SRishi Srivatsavai 8624eaa4710SRishi Srivatsavai for (i = 0; i < DLADM_MAX_PROPS; i++, pdp++) { 8634eaa4710SRishi Srivatsavai if (!(pdp->pd_flags & PD_AFTER_PERM)) 8644eaa4710SRishi Srivatsavai continue; 8654eaa4710SRishi Srivatsavai if (prop_name != NULL && 8664eaa4710SRishi Srivatsavai strcasecmp(prop_name, pdp->pd_name) != 0) 8674eaa4710SRishi Srivatsavai continue; 8684eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, NULL, 8694eaa4710SRishi Srivatsavai 0, flags, 0); 8704eaa4710SRishi Srivatsavai } 8714eaa4710SRishi Srivatsavai } 872d62bc4baSyz147064 } 873d62bc4baSyz147064 return (status); 874d62bc4baSyz147064 } 875d62bc4baSyz147064 876d62bc4baSyz147064 /* 87762ee1d25SArtem Kachitchkine * Walk all link properties of the given specific link. 87862ee1d25SArtem Kachitchkine * 87962ee1d25SArtem Kachitchkine * Note: this function currently lacks the ability to walk _all_ private 88062ee1d25SArtem Kachitchkine * properties if the link, because there is no kernel interface to 88162ee1d25SArtem Kachitchkine * retrieve all known private property names. Once such an interface 88262ee1d25SArtem Kachitchkine * is added, this function should be fixed accordingly. 883d62bc4baSyz147064 */ 884d62bc4baSyz147064 dladm_status_t 8854ac67f02SAnurag S. Maskey dladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg, 8864ac67f02SAnurag S. Maskey int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 8870ba2cbe9Sxc151355 { 888d62bc4baSyz147064 dladm_status_t status; 889d62bc4baSyz147064 datalink_class_t class; 890d62bc4baSyz147064 uint_t media; 891d62bc4baSyz147064 int i; 8920ba2cbe9Sxc151355 893d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || func == NULL) 894d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 8950ba2cbe9Sxc151355 8964ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 8974ac67f02SAnurag S. Maskey NULL, 0); 898d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 899d62bc4baSyz147064 return (status); 900d62bc4baSyz147064 90162ee1d25SArtem Kachitchkine /* public */ 902d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 903d62bc4baSyz147064 if (!(prop_table[i].pd_class & class)) 904d62bc4baSyz147064 continue; 905d62bc4baSyz147064 906d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media)) 907d62bc4baSyz147064 continue; 908d62bc4baSyz147064 9094ac67f02SAnurag S. Maskey if (func(handle, linkid, prop_table[i].pd_name, arg) == 910d62bc4baSyz147064 DLADM_WALK_TERMINATE) { 911d62bc4baSyz147064 break; 912d62bc4baSyz147064 } 913d62bc4baSyz147064 } 914d62bc4baSyz147064 91562ee1d25SArtem Kachitchkine /* private */ 91662ee1d25SArtem Kachitchkine status = i_dladm_walk_linkprop_priv_db(handle, linkid, arg, func); 91762ee1d25SArtem Kachitchkine 91862ee1d25SArtem Kachitchkine return (status); 919d62bc4baSyz147064 } 920d62bc4baSyz147064 921d62bc4baSyz147064 /* 922d62bc4baSyz147064 * Get linkprop of the given specific link. 923d62bc4baSyz147064 */ 924d62bc4baSyz147064 dladm_status_t 9254ac67f02SAnurag S. Maskey dladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid, 9264ac67f02SAnurag S. Maskey dladm_prop_type_t type, const char *prop_name, char **prop_val, 9274ac67f02SAnurag S. Maskey uint_t *val_cntp) 928d62bc4baSyz147064 { 929d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 930d62bc4baSyz147064 datalink_class_t class; 931d62bc4baSyz147064 uint_t media; 932d62bc4baSyz147064 prop_desc_t *pdp; 9334045d941Ssowmini uint_t cnt, dld_flags = 0; 934d62bc4baSyz147064 int i; 935afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 936d62bc4baSyz147064 9374045d941Ssowmini if (type == DLADM_PROP_VAL_DEFAULT) 938f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_DEFAULT; 939f0f2c3a5SGirish Moodalbail else if (type == DLADM_PROP_VAL_MODIFIABLE) 940f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_POSSIBLE; 9414045d941Ssowmini 942d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 943d62bc4baSyz147064 prop_val == NULL || val_cntp == NULL || *val_cntp == 0) 944d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 945d62bc4baSyz147064 946d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) 947d62bc4baSyz147064 if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) 948d62bc4baSyz147064 break; 949d62bc4baSyz147064 950e7801d59Ssowmini if (i == DLADM_MAX_PROPS) { 951e7801d59Ssowmini if (prop_name[0] == '_') { 952e7801d59Ssowmini /* 953e7801d59Ssowmini * private property. 954e7801d59Ssowmini */ 95562ee1d25SArtem Kachitchkine if (type == DLADM_PROP_VAL_PERSISTENT) 95662ee1d25SArtem Kachitchkine return (i_dladm_get_linkprop_db(handle, linkid, 95762ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp)); 95862ee1d25SArtem Kachitchkine else 95962ee1d25SArtem Kachitchkine return (i_dladm_get_priv_prop(handle, linkid, 96062ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp, type, 96162ee1d25SArtem Kachitchkine dld_flags)); 962e7801d59Ssowmini } else { 963d62bc4baSyz147064 return (DLADM_STATUS_NOTFOUND); 964e7801d59Ssowmini } 965e7801d59Ssowmini } 966d62bc4baSyz147064 967d62bc4baSyz147064 pdp = &prop_table[i]; 968d62bc4baSyz147064 9694ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 9704ac67f02SAnurag S. Maskey NULL, 0); 971d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 972d62bc4baSyz147064 return (status); 973d62bc4baSyz147064 974d62bc4baSyz147064 if (!(pdp->pd_class & class)) 975d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 976d62bc4baSyz147064 977d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 978d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 979d62bc4baSyz147064 980d62bc4baSyz147064 switch (type) { 981d62bc4baSyz147064 case DLADM_PROP_VAL_CURRENT: 9824ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 9834ac67f02SAnurag S. Maskey media, dld_flags, &perm_flags); 984afdda45fSVasumathi Sundaram - Sun Microsystems break; 985afdda45fSVasumathi Sundaram - Sun Microsystems 986afdda45fSVasumathi Sundaram - Sun Microsystems case DLADM_PROP_VAL_PERM: 987afdda45fSVasumathi Sundaram - Sun Microsystems if (pdp->pd_set == NULL) { 988afdda45fSVasumathi Sundaram - Sun Microsystems perm_flags = MAC_PROP_PERM_READ; 989afdda45fSVasumathi Sundaram - Sun Microsystems } else { 9904ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 9914ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 992afdda45fSVasumathi Sundaram - Sun Microsystems } 993afdda45fSVasumathi Sundaram - Sun Microsystems 994afdda45fSVasumathi Sundaram - Sun Microsystems *prop_val[0] = '\0'; 99563a6526dSMichael Lim *val_cntp = 1; 996da14cebeSEric Cheng if (status == DLADM_STATUS_OK) 997da14cebeSEric Cheng (void) dladm_perm2str(perm_flags, *prop_val); 998d62bc4baSyz147064 break; 999d62bc4baSyz147064 1000d62bc4baSyz147064 case DLADM_PROP_VAL_DEFAULT: 100113a55820Sar224390 /* 100213a55820Sar224390 * If defaults are not defined for the property, 100313a55820Sar224390 * pd_defval.vd_name should be null. If the driver 100413a55820Sar224390 * has to be contacted for the value, vd_name should 100513a55820Sar224390 * be the empty string (""). Otherwise, dladm will 100613a55820Sar224390 * just print whatever is in the table. 100713a55820Sar224390 */ 1008d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) { 1009d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 1010d62bc4baSyz147064 break; 1011d62bc4baSyz147064 } 10124045d941Ssowmini 10134045d941Ssowmini if (strlen(pdp->pd_defval.vd_name) == 0) { 10144ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 10154ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 10164045d941Ssowmini } else { 1017d62bc4baSyz147064 (void) strcpy(*prop_val, pdp->pd_defval.vd_name); 10184045d941Ssowmini } 1019d62bc4baSyz147064 *val_cntp = 1; 1020d62bc4baSyz147064 break; 1021d62bc4baSyz147064 1022d62bc4baSyz147064 case DLADM_PROP_VAL_MODIFIABLE: 1023d62bc4baSyz147064 if (pdp->pd_getmod != NULL) { 10244ac67f02SAnurag S. Maskey status = pdp->pd_getmod(handle, pdp, linkid, prop_val, 1025afdda45fSVasumathi Sundaram - Sun Microsystems val_cntp, media, dld_flags, &perm_flags); 1026d62bc4baSyz147064 break; 1027d62bc4baSyz147064 } 1028d62bc4baSyz147064 cnt = pdp->pd_noptval; 1029d62bc4baSyz147064 if (cnt == 0) { 1030d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 1031d62bc4baSyz147064 } else if (cnt > *val_cntp) { 1032d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 1033d62bc4baSyz147064 } else { 1034d62bc4baSyz147064 for (i = 0; i < cnt; i++) { 1035d62bc4baSyz147064 (void) strcpy(prop_val[i], 1036d62bc4baSyz147064 pdp->pd_optval[i].vd_name); 1037d62bc4baSyz147064 } 1038d62bc4baSyz147064 *val_cntp = cnt; 1039d62bc4baSyz147064 } 1040d62bc4baSyz147064 break; 1041d62bc4baSyz147064 case DLADM_PROP_VAL_PERSISTENT: 1042d62bc4baSyz147064 if (pdp->pd_flags & PD_TEMPONLY) 1043d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 10444ac67f02SAnurag S. Maskey status = i_dladm_get_linkprop_db(handle, linkid, prop_name, 1045d62bc4baSyz147064 prop_val, val_cntp); 1046d62bc4baSyz147064 break; 1047d62bc4baSyz147064 default: 1048d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 1049d62bc4baSyz147064 break; 1050d62bc4baSyz147064 } 1051d62bc4baSyz147064 1052d62bc4baSyz147064 return (status); 1053d62bc4baSyz147064 } 1054d62bc4baSyz147064 10554eaa4710SRishi Srivatsavai /* 10564eaa4710SRishi Srivatsavai * Get linkprop of the given specific link and run any possible conversion 10574eaa4710SRishi Srivatsavai * of the values using the check function for the property. Fails if the 10584eaa4710SRishi Srivatsavai * check function doesn't succeed for the property value. 10594eaa4710SRishi Srivatsavai */ 10604eaa4710SRishi Srivatsavai dladm_status_t 10614eaa4710SRishi Srivatsavai dladm_get_linkprop_values(dladm_handle_t handle, datalink_id_t linkid, 10624eaa4710SRishi Srivatsavai dladm_prop_type_t type, const char *prop_name, uint_t *ret_val, 10634eaa4710SRishi Srivatsavai uint_t *val_cntp) 10644eaa4710SRishi Srivatsavai { 10654eaa4710SRishi Srivatsavai dladm_status_t status; 10664eaa4710SRishi Srivatsavai datalink_class_t class; 10674eaa4710SRishi Srivatsavai uint_t media; 10684eaa4710SRishi Srivatsavai prop_desc_t *pdp; 10694eaa4710SRishi Srivatsavai uint_t dld_flags; 10704eaa4710SRishi Srivatsavai int valc, i; 10714eaa4710SRishi Srivatsavai char **prop_val; 10724eaa4710SRishi Srivatsavai uint_t perm_flags; 10734eaa4710SRishi Srivatsavai 10744eaa4710SRishi Srivatsavai if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 10754eaa4710SRishi Srivatsavai ret_val == NULL || val_cntp == NULL || *val_cntp == 0) 10764eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 10774eaa4710SRishi Srivatsavai 10784eaa4710SRishi Srivatsavai for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++) 10794eaa4710SRishi Srivatsavai if (strcasecmp(prop_name, pdp->pd_name) == 0) 10804eaa4710SRishi Srivatsavai break; 10814eaa4710SRishi Srivatsavai 10824eaa4710SRishi Srivatsavai if (pdp == prop_table + DLADM_MAX_PROPS) 10834eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTFOUND); 10844eaa4710SRishi Srivatsavai 10854eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_CHECK_ALLOC) 10864eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 10874eaa4710SRishi Srivatsavai 10884eaa4710SRishi Srivatsavai status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 10894eaa4710SRishi Srivatsavai NULL, 0); 10904eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 10914eaa4710SRishi Srivatsavai return (status); 10924eaa4710SRishi Srivatsavai 10934eaa4710SRishi Srivatsavai if (!(pdp->pd_class & class)) 10944eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 10954eaa4710SRishi Srivatsavai 10964eaa4710SRishi Srivatsavai if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 10974eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 10984eaa4710SRishi Srivatsavai 10994eaa4710SRishi Srivatsavai prop_val = malloc(*val_cntp * sizeof (*prop_val) + 11004eaa4710SRishi Srivatsavai *val_cntp * DLADM_PROP_VAL_MAX); 11014eaa4710SRishi Srivatsavai if (prop_val == NULL) 11024eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOMEM); 11034eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 11044eaa4710SRishi Srivatsavai prop_val[valc] = (char *)(prop_val + *val_cntp) + 11054eaa4710SRishi Srivatsavai valc * DLADM_PROP_VAL_MAX; 11064eaa4710SRishi Srivatsavai 11074eaa4710SRishi Srivatsavai dld_flags = (type == DLADM_PROP_VAL_DEFAULT) ? MAC_PROP_DEFAULT : 0; 11084eaa4710SRishi Srivatsavai 11094eaa4710SRishi Srivatsavai switch (type) { 11104eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_CURRENT: 11114eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 11124eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 11134eaa4710SRishi Srivatsavai break; 11144eaa4710SRishi Srivatsavai 11154eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_DEFAULT: 11164eaa4710SRishi Srivatsavai /* 11174eaa4710SRishi Srivatsavai * If defaults are not defined for the property, 11184eaa4710SRishi Srivatsavai * pd_defval.vd_name should be null. If the driver 11194eaa4710SRishi Srivatsavai * has to be contacted for the value, vd_name should 11204eaa4710SRishi Srivatsavai * be the empty string (""). Otherwise, dladm will 11214eaa4710SRishi Srivatsavai * just print whatever is in the table. 11224eaa4710SRishi Srivatsavai */ 11234eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name == NULL) { 11244eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOTSUP; 11254eaa4710SRishi Srivatsavai break; 11264eaa4710SRishi Srivatsavai } 11274eaa4710SRishi Srivatsavai 11284eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name[0] != '\0') { 11294eaa4710SRishi Srivatsavai *val_cntp = 1; 11304eaa4710SRishi Srivatsavai *ret_val = pdp->pd_defval.vd_val; 11314eaa4710SRishi Srivatsavai free(prop_val); 11324eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 11334eaa4710SRishi Srivatsavai } 11344eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 11354eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 11364eaa4710SRishi Srivatsavai break; 11374eaa4710SRishi Srivatsavai 11384eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_PERSISTENT: 11394eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_TEMPONLY) 11404eaa4710SRishi Srivatsavai status = DLADM_STATUS_TEMPONLY; 11414eaa4710SRishi Srivatsavai else 11424eaa4710SRishi Srivatsavai status = i_dladm_get_linkprop_db(handle, linkid, 11434eaa4710SRishi Srivatsavai prop_name, prop_val, val_cntp); 11444eaa4710SRishi Srivatsavai break; 11454eaa4710SRishi Srivatsavai 11464eaa4710SRishi Srivatsavai default: 11474eaa4710SRishi Srivatsavai status = DLADM_STATUS_BADARG; 11484eaa4710SRishi Srivatsavai break; 11494eaa4710SRishi Srivatsavai } 11504eaa4710SRishi Srivatsavai 11514eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 11524eaa4710SRishi Srivatsavai if (pdp->pd_check != NULL) { 11534eaa4710SRishi Srivatsavai val_desc_t *vdp; 11544eaa4710SRishi Srivatsavai 11554eaa4710SRishi Srivatsavai vdp = malloc(sizeof (val_desc_t) * *val_cntp); 11564eaa4710SRishi Srivatsavai if (vdp == NULL) 11574eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOMEM; 11584eaa4710SRishi Srivatsavai else 11594eaa4710SRishi Srivatsavai status = pdp->pd_check(handle, pdp, linkid, 11604eaa4710SRishi Srivatsavai prop_val, *val_cntp, vdp, media); 11614eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 11624eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 11634eaa4710SRishi Srivatsavai ret_val[valc] = vdp[valc].vd_val; 11644eaa4710SRishi Srivatsavai } 11654eaa4710SRishi Srivatsavai free(vdp); 11664eaa4710SRishi Srivatsavai } else { 11674eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) { 11684eaa4710SRishi Srivatsavai for (i = 0; i < pdp->pd_noptval; i++) { 11694eaa4710SRishi Srivatsavai if (strcmp(pdp->pd_optval[i].vd_name, 11704eaa4710SRishi Srivatsavai prop_val[valc]) == 0) { 11714eaa4710SRishi Srivatsavai ret_val[valc] = 11724eaa4710SRishi Srivatsavai pdp->pd_optval[i].vd_val; 11734eaa4710SRishi Srivatsavai break; 11744eaa4710SRishi Srivatsavai } 11754eaa4710SRishi Srivatsavai } 11764eaa4710SRishi Srivatsavai if (i == pdp->pd_noptval) { 11774eaa4710SRishi Srivatsavai status = DLADM_STATUS_FAILED; 11784eaa4710SRishi Srivatsavai break; 11794eaa4710SRishi Srivatsavai } 11804eaa4710SRishi Srivatsavai } 11814eaa4710SRishi Srivatsavai } 11824eaa4710SRishi Srivatsavai } 11834eaa4710SRishi Srivatsavai 11844eaa4710SRishi Srivatsavai free(prop_val); 11854eaa4710SRishi Srivatsavai 11864eaa4710SRishi Srivatsavai return (status); 11874eaa4710SRishi Srivatsavai } 11884eaa4710SRishi Srivatsavai 1189d62bc4baSyz147064 /*ARGSUSED*/ 1190d62bc4baSyz147064 static int 11914ac67f02SAnurag S. Maskey i_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid, 11924ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 1193d62bc4baSyz147064 { 1194d62bc4baSyz147064 char *buf, **propvals; 1195d62bc4baSyz147064 uint_t i, valcnt = DLADM_MAX_PROP_VALCNT; 1196d62bc4baSyz147064 1197d62bc4baSyz147064 if ((buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * 1198d62bc4baSyz147064 DLADM_MAX_PROP_VALCNT)) == NULL) { 1199d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1200d62bc4baSyz147064 } 1201d62bc4baSyz147064 1202d62bc4baSyz147064 propvals = (char **)(void *)buf; 1203d62bc4baSyz147064 for (i = 0; i < valcnt; i++) { 1204d62bc4baSyz147064 propvals[i] = buf + 1205d62bc4baSyz147064 sizeof (char *) * DLADM_MAX_PROP_VALCNT + 1206d62bc4baSyz147064 i * DLADM_PROP_VAL_MAX; 1207d62bc4baSyz147064 } 1208d62bc4baSyz147064 12094ac67f02SAnurag S. Maskey if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 12104ac67f02SAnurag S. Maskey prop_name, propvals, &valcnt) != DLADM_STATUS_OK) { 1211d62bc4baSyz147064 goto done; 1212d62bc4baSyz147064 } 1213d62bc4baSyz147064 12144ac67f02SAnurag S. Maskey (void) dladm_set_linkprop(handle, linkid, prop_name, propvals, valcnt, 1215d62bc4baSyz147064 DLADM_OPT_ACTIVE); 1216d62bc4baSyz147064 1217d62bc4baSyz147064 done: 1218d62bc4baSyz147064 if (buf != NULL) 1219d62bc4baSyz147064 free(buf); 1220d62bc4baSyz147064 1221d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1222d62bc4baSyz147064 } 1223d62bc4baSyz147064 1224d62bc4baSyz147064 /*ARGSUSED*/ 1225d62bc4baSyz147064 static int 12264ac67f02SAnurag S. Maskey i_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg) 1227d62bc4baSyz147064 { 1228da14cebeSEric Cheng datalink_class_t class; 1229da14cebeSEric Cheng dladm_status_t status; 1230da14cebeSEric Cheng 12314ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, 12324ac67f02SAnurag S. Maskey NULL, 0); 1233da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 1234da14cebeSEric Cheng return (DLADM_WALK_TERMINATE); 1235da14cebeSEric Cheng 1236da14cebeSEric Cheng if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0) 12374ac67f02SAnurag S. Maskey (void) dladm_init_linkprop(handle, linkid, B_TRUE); 1238da14cebeSEric Cheng 1239d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 12400ba2cbe9Sxc151355 } 12410ba2cbe9Sxc151355 12420ba2cbe9Sxc151355 dladm_status_t 12434ac67f02SAnurag S. Maskey dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, 12444ac67f02SAnurag S. Maskey boolean_t any_media) 12450ba2cbe9Sxc151355 { 124630890389Sartem datalink_media_t dmedia; 124730890389Sartem uint32_t media; 124830890389Sartem 124930890389Sartem dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI; 125030890389Sartem 1251d62bc4baSyz147064 if (linkid == DATALINK_ALL_LINKID) { 12524ac67f02SAnurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, 12534ac67f02SAnurag S. Maskey NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); 12544ac67f02SAnurag S. Maskey } else if (any_media || 12554ac67f02SAnurag S. Maskey ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL, 12564ac67f02SAnurag S. Maskey 0) == DLADM_STATUS_OK) && 125730890389Sartem DATALINK_MEDIA_ACCEPTED(dmedia, media))) { 12584ac67f02SAnurag S. Maskey (void) dladm_walk_linkprop(handle, linkid, NULL, 12594ac67f02SAnurag S. Maskey i_dladm_init_one_prop); 1260d62bc4baSyz147064 } 1261d62bc4baSyz147064 return (DLADM_STATUS_OK); 12620ba2cbe9Sxc151355 } 1263f4b3ec61Sdh155122 1264e7801d59Ssowmini /* ARGSUSED */ 1265f4b3ec61Sdh155122 static dladm_status_t 12664ac67f02SAnurag S. Maskey do_get_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1267da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1268da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1269f4b3ec61Sdh155122 { 1270d62bc4baSyz147064 char zone_name[ZONENAME_MAX]; 1271d62bc4baSyz147064 zoneid_t zid; 1272d62bc4baSyz147064 dladm_status_t status; 12733bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 12743bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1275f4b3ec61Sdh155122 12764045d941Ssowmini if (flags != 0) 12774045d941Ssowmini return (DLADM_STATUS_NOTSUP); 12784045d941Ssowmini 12794ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1280da14cebeSEric Cheng &status, perm_flags); 1281d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1282d62bc4baSyz147064 return (status); 1283d62bc4baSyz147064 12843bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 12853bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid, cp, sizeof (zid)); 12863bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 12873bc21d0aSAruna Ramakrishna - Sun Microsystems 1288d62bc4baSyz147064 *val_cnt = 1; 1289d62bc4baSyz147064 if (zid != GLOBAL_ZONEID) { 1290afdda45fSVasumathi Sundaram - Sun Microsystems if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) { 1291f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1292afdda45fSVasumathi Sundaram - Sun Microsystems } 1293f4b3ec61Sdh155122 1294d62bc4baSyz147064 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX); 129547a01978Sbw } else { 1296d62bc4baSyz147064 *prop_val[0] = '\0'; 129747a01978Sbw } 1298f4b3ec61Sdh155122 1299f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1300f4b3ec61Sdh155122 } 1301f4b3ec61Sdh155122 1302f4b3ec61Sdh155122 typedef int (*zone_get_devroot_t)(char *, char *, size_t); 1303f4b3ec61Sdh155122 1304f4b3ec61Sdh155122 static int 1305f4b3ec61Sdh155122 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen) 1306f4b3ec61Sdh155122 { 1307f4b3ec61Sdh155122 char root[MAXPATHLEN]; 1308f4b3ec61Sdh155122 zone_get_devroot_t real_zone_get_devroot; 1309f4b3ec61Sdh155122 void *dlhandle; 1310f4b3ec61Sdh155122 void *sym; 1311f4b3ec61Sdh155122 int ret; 1312f4b3ec61Sdh155122 1313f4b3ec61Sdh155122 if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL) 1314f4b3ec61Sdh155122 return (-1); 1315f4b3ec61Sdh155122 1316f4b3ec61Sdh155122 if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) { 1317f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1318f4b3ec61Sdh155122 return (-1); 1319f4b3ec61Sdh155122 } 1320f4b3ec61Sdh155122 1321f4b3ec61Sdh155122 real_zone_get_devroot = (zone_get_devroot_t)sym; 1322f4b3ec61Sdh155122 1323f4b3ec61Sdh155122 if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0) 1324f4b3ec61Sdh155122 (void) snprintf(dev, devlen, "%s%s", root, "/dev"); 1325f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1326f4b3ec61Sdh155122 return (ret); 1327f4b3ec61Sdh155122 } 1328f4b3ec61Sdh155122 1329f4b3ec61Sdh155122 static dladm_status_t 13304ac67f02SAnurag S. Maskey i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid, 13314ac67f02SAnurag S. Maskey datalink_id_t linkid, boolean_t add) 1332f4b3ec61Sdh155122 { 1333f4b3ec61Sdh155122 char path[MAXPATHLEN]; 1334d62bc4baSyz147064 char name[MAXLINKNAMELEN]; 1335f4b3ec61Sdh155122 di_prof_t prof = NULL; 1336f4b3ec61Sdh155122 char zone_name[ZONENAME_MAX]; 1337f4b3ec61Sdh155122 dladm_status_t status; 1338d62bc4baSyz147064 int ret; 1339f4b3ec61Sdh155122 1340f4b3ec61Sdh155122 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) 1341f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1342f4b3ec61Sdh155122 if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0) 1343f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1344f4b3ec61Sdh155122 if (di_prof_init(path, &prof) != 0) 1345f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1346f4b3ec61Sdh155122 13474ac67f02SAnurag S. Maskey status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN); 1348f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1349d62bc4baSyz147064 goto cleanup; 1350f4b3ec61Sdh155122 1351d62bc4baSyz147064 if (add) 1352d62bc4baSyz147064 ret = di_prof_add_dev(prof, name); 1353d62bc4baSyz147064 else 1354d62bc4baSyz147064 ret = di_prof_add_exclude(prof, name); 1355f4b3ec61Sdh155122 1356d62bc4baSyz147064 if (ret != 0) { 1357d62bc4baSyz147064 status = dladm_errno2status(errno); 1358d62bc4baSyz147064 goto cleanup; 1359f4b3ec61Sdh155122 } 1360f4b3ec61Sdh155122 1361d62bc4baSyz147064 if (di_prof_commit(prof) != 0) 1362d62bc4baSyz147064 status = dladm_errno2status(errno); 1363d62bc4baSyz147064 cleanup: 1364d62bc4baSyz147064 if (prof) 1365d62bc4baSyz147064 di_prof_fini(prof); 1366d62bc4baSyz147064 1367d62bc4baSyz147064 return (status); 1368f4b3ec61Sdh155122 } 1369f4b3ec61Sdh155122 1370e7801d59Ssowmini /* ARGSUSED */ 1371f4b3ec61Sdh155122 static dladm_status_t 13724ac67f02SAnurag S. Maskey do_set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 13734ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1374f4b3ec61Sdh155122 { 13753bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 1376f4b3ec61Sdh155122 zoneid_t zid_old, zid_new; 13773bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 13783bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 13793bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1380f4b3ec61Sdh155122 1381f4b3ec61Sdh155122 if (val_cnt != 1) 1382f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1383f4b3ec61Sdh155122 13843bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = (dld_ioc_zid_t *)vdp->vd_val; 13853bc21d0aSAruna Ramakrishna - Sun Microsystems 13864ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1387da14cebeSEric Cheng &status, NULL); 1388f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1389f4b3ec61Sdh155122 return (status); 1390f4b3ec61Sdh155122 13913bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 13923bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid_old, cp, sizeof (zid_old)); 13933bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1394f4b3ec61Sdh155122 13953bc21d0aSAruna Ramakrishna - Sun Microsystems zid_new = dzp->diz_zid; 13963bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new == zid_old) 1397*2b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 1398*2b24ab6bSSebastien Roy 1399*2b24ab6bSSebastien Roy if ((status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, val_cnt, 1400*2b24ab6bSSebastien Roy flags, media)) != DLADM_STATUS_OK) 14013bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 14023bc21d0aSAruna Ramakrishna - Sun Microsystems 1403d62bc4baSyz147064 /* 1404*2b24ab6bSSebastien Roy * It is okay to fail to update the /dev entry (some vanity-named 1405*2b24ab6bSSebastien Roy * links do not have a /dev entry). 1406d62bc4baSyz147064 */ 1407d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) { 14084ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, 14094ac67f02SAnurag S. Maskey B_FALSE); 1410d62bc4baSyz147064 } 1411*2b24ab6bSSebastien Roy if (zid_new != GLOBAL_ZONEID) 14124ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE); 1413f4b3ec61Sdh155122 1414f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1415f4b3ec61Sdh155122 } 1416f4b3ec61Sdh155122 1417f4b3ec61Sdh155122 /* ARGSUSED */ 1418f4b3ec61Sdh155122 static dladm_status_t 14194ac67f02SAnurag S. Maskey do_check_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14204ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1421f4b3ec61Sdh155122 { 14223bc21d0aSAruna Ramakrishna - Sun Microsystems char *zone_name; 14233bc21d0aSAruna Ramakrishna - Sun Microsystems zoneid_t zoneid; 14243bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 14253bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1426f4b3ec61Sdh155122 1427f4b3ec61Sdh155122 if (val_cnt != 1) 1428f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1429f4b3ec61Sdh155122 14303bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = malloc(sizeof (dld_ioc_zid_t)); 14313bc21d0aSAruna Ramakrishna - Sun Microsystems if (dzp == NULL) 14323bc21d0aSAruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM); 1433f4b3ec61Sdh155122 1434da14cebeSEric Cheng zone_name = (prop_val != NULL) ? *prop_val : GLOBAL_ZONENAME; 14353bc21d0aSAruna Ramakrishna - Sun Microsystems if ((zoneid = getzoneidbyname(zone_name)) == -1) { 14363bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14373bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 14383bc21d0aSAruna Ramakrishna - Sun Microsystems } 14393bc21d0aSAruna Ramakrishna - Sun Microsystems 14403bc21d0aSAruna Ramakrishna - Sun Microsystems if (zoneid != GLOBAL_ZONEID) { 1441f4b3ec61Sdh155122 ushort_t flags; 1442f4b3ec61Sdh155122 14433bc21d0aSAruna Ramakrishna - Sun Microsystems if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &flags, 1444f4b3ec61Sdh155122 sizeof (flags)) < 0) { 14453bc21d0aSAruna Ramakrishna - Sun Microsystems status = dladm_errno2status(errno); 14463bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1447f4b3ec61Sdh155122 } 1448f4b3ec61Sdh155122 1449f4b3ec61Sdh155122 if (!(flags & ZF_NET_EXCL)) { 14503bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14513bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1452f4b3ec61Sdh155122 } 1453f4b3ec61Sdh155122 } 1454f4b3ec61Sdh155122 14553bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memset(dzp, 0, sizeof (dld_ioc_zid_t)); 14563bc21d0aSAruna Ramakrishna - Sun Microsystems 14573bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zoneid; 1458*2b24ab6bSSebastien Roy dzp->diz_linkid = linkid; 14593bc21d0aSAruna Ramakrishna - Sun Microsystems 14603bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dzp; 1461f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 14623bc21d0aSAruna Ramakrishna - Sun Microsystems done: 14633bc21d0aSAruna Ramakrishna - Sun Microsystems free(dzp); 14643bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 1465f4b3ec61Sdh155122 } 1466f4b3ec61Sdh155122 1467e7801d59Ssowmini /* ARGSUSED */ 1468f4b3ec61Sdh155122 static dladm_status_t 146962ee1d25SArtem Kachitchkine i_dladm_maxbw_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1470da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1471da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1472da14cebeSEric Cheng { 1473da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1474da14cebeSEric Cheng mac_resource_props_t mrp; 1475da14cebeSEric Cheng dladm_status_t status; 1476da14cebeSEric Cheng 14774ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1478da14cebeSEric Cheng &status, perm_flags); 1479da14cebeSEric Cheng if (dip == NULL) 1480da14cebeSEric Cheng return (status); 1481da14cebeSEric Cheng 1482da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1483da14cebeSEric Cheng free(dip); 1484da14cebeSEric Cheng 1485da14cebeSEric Cheng if ((mrp.mrp_mask & MRP_MAXBW) == 0) { 1486da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1487da14cebeSEric Cheng } else { 1488da14cebeSEric Cheng (void) dladm_bw2str(mrp.mrp_maxbw, prop_val[0]); 1489da14cebeSEric Cheng } 1490da14cebeSEric Cheng *val_cnt = 1; 1491da14cebeSEric Cheng return (DLADM_STATUS_OK); 1492da14cebeSEric Cheng } 1493da14cebeSEric Cheng 1494da14cebeSEric Cheng /* ARGSUSED */ 1495da14cebeSEric Cheng static dladm_status_t 14964ac67f02SAnurag S. Maskey do_check_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14974ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1498da14cebeSEric Cheng { 1499da14cebeSEric Cheng uint64_t *maxbw; 1500da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1501da14cebeSEric Cheng 1502da14cebeSEric Cheng if (val_cnt != 1) 1503da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1504da14cebeSEric Cheng 1505da14cebeSEric Cheng maxbw = malloc(sizeof (uint64_t)); 1506da14cebeSEric Cheng if (maxbw == NULL) 1507da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1508da14cebeSEric Cheng 1509da14cebeSEric Cheng status = dladm_str2bw(*prop_val, maxbw); 1510da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1511da14cebeSEric Cheng free(maxbw); 1512da14cebeSEric Cheng return (status); 1513da14cebeSEric Cheng } 1514da14cebeSEric Cheng 1515da14cebeSEric Cheng if ((*maxbw < MRP_MAXBW_MINVAL) && (*maxbw != 0)) { 1516da14cebeSEric Cheng free(maxbw); 1517da14cebeSEric Cheng return (DLADM_STATUS_MINMAXBW); 1518da14cebeSEric Cheng } 1519da14cebeSEric Cheng 1520da14cebeSEric Cheng vdp->vd_val = (uintptr_t)maxbw; 1521da14cebeSEric Cheng return (DLADM_STATUS_OK); 1522da14cebeSEric Cheng } 1523da14cebeSEric Cheng 1524da14cebeSEric Cheng /* ARGSUSED */ 1525da14cebeSEric Cheng dladm_status_t 1526da14cebeSEric Cheng do_extract_maxbw(val_desc_t *vdp, void *arg, uint_t cnt) 1527da14cebeSEric Cheng { 1528da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1529da14cebeSEric Cheng 1530da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_maxbw, sizeof (uint64_t)); 1531da14cebeSEric Cheng mrp->mrp_mask |= MRP_MAXBW; 1532da14cebeSEric Cheng 1533da14cebeSEric Cheng return (DLADM_STATUS_OK); 1534da14cebeSEric Cheng } 1535da14cebeSEric Cheng 1536da14cebeSEric Cheng /* ARGSUSED */ 1537da14cebeSEric Cheng static dladm_status_t 153862ee1d25SArtem Kachitchkine i_dladm_cpus_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1539da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1540da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1541da14cebeSEric Cheng { 1542da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1543da14cebeSEric Cheng mac_resource_props_t mrp; 1544da14cebeSEric Cheng int i; 1545da14cebeSEric Cheng uint32_t ncpus; 1546da14cebeSEric Cheng uchar_t *cp; 1547da14cebeSEric Cheng dladm_status_t status; 1548da14cebeSEric Cheng 15494ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1550da14cebeSEric Cheng &status, perm_flags); 1551da14cebeSEric Cheng if (dip == NULL) 1552da14cebeSEric Cheng return (status); 1553da14cebeSEric Cheng 1554da14cebeSEric Cheng cp = (uchar_t *)dip->pr_val; 1555da14cebeSEric Cheng (void) memcpy(&mrp, cp, sizeof (mac_resource_props_t)); 1556da14cebeSEric Cheng free(dip); 1557da14cebeSEric Cheng 1558da14cebeSEric Cheng ncpus = mrp.mrp_ncpus; 1559da14cebeSEric Cheng 1560da14cebeSEric Cheng if (ncpus > *val_cnt) 1561da14cebeSEric Cheng return (DLADM_STATUS_TOOSMALL); 1562da14cebeSEric Cheng 1563da14cebeSEric Cheng if (ncpus == 0) { 1564da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1565da14cebeSEric Cheng *val_cnt = 1; 1566da14cebeSEric Cheng return (DLADM_STATUS_OK); 1567da14cebeSEric Cheng } 1568da14cebeSEric Cheng 1569da14cebeSEric Cheng *val_cnt = ncpus; 1570da14cebeSEric Cheng for (i = 0; i < ncpus; i++) { 1571da14cebeSEric Cheng (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 1572da14cebeSEric Cheng "%u", mrp.mrp_cpu[i]); 1573da14cebeSEric Cheng } 1574da14cebeSEric Cheng return (DLADM_STATUS_OK); 1575da14cebeSEric Cheng } 1576da14cebeSEric Cheng 1577da14cebeSEric Cheng /* ARGSUSED */ 1578da14cebeSEric Cheng static dladm_status_t 15794ac67f02SAnurag S. Maskey do_set_res(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 15804ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1581da14cebeSEric Cheng { 1582da14cebeSEric Cheng mac_resource_props_t mrp; 1583da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1584da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1585da14cebeSEric Cheng 1586da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1587da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1588da14cebeSEric Cheng flags, &status); 1589da14cebeSEric Cheng 1590da14cebeSEric Cheng if (dip == NULL) 1591da14cebeSEric Cheng return (status); 1592da14cebeSEric Cheng 1593da14cebeSEric Cheng if (vdp->vd_val == RESET_VAL) { 1594da14cebeSEric Cheng switch (dip->pr_num) { 1595da14cebeSEric Cheng case MAC_PROP_MAXBW: 1596da14cebeSEric Cheng mrp.mrp_maxbw = MRP_MAXBW_RESETVAL; 1597da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1598da14cebeSEric Cheng break; 1599da14cebeSEric Cheng case MAC_PROP_PRIO: 1600da14cebeSEric Cheng mrp.mrp_priority = MPL_RESET; 1601da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1602da14cebeSEric Cheng break; 1603da14cebeSEric Cheng default: 1604da14cebeSEric Cheng free(dip); 1605da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1606da14cebeSEric Cheng } 1607da14cebeSEric Cheng } else { 1608da14cebeSEric Cheng switch (dip->pr_num) { 1609da14cebeSEric Cheng case MAC_PROP_MAXBW: 1610da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_maxbw, 1611da14cebeSEric Cheng sizeof (uint64_t)); 1612da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1613da14cebeSEric Cheng break; 1614da14cebeSEric Cheng case MAC_PROP_PRIO: 1615da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_priority, 1616da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1617da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1618da14cebeSEric Cheng break; 1619da14cebeSEric Cheng default: 1620da14cebeSEric Cheng free(dip); 1621da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1622da14cebeSEric Cheng } 1623da14cebeSEric Cheng } 1624da14cebeSEric Cheng 1625da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 16264ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1627da14cebeSEric Cheng free(dip); 1628da14cebeSEric Cheng return (status); 1629da14cebeSEric Cheng } 1630da14cebeSEric Cheng 1631da14cebeSEric Cheng /* ARGSUSED */ 1632da14cebeSEric Cheng static dladm_status_t 16334ac67f02SAnurag S. Maskey do_set_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16344ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1635da14cebeSEric Cheng { 1636da14cebeSEric Cheng mac_resource_props_t mrp; 1637da14cebeSEric Cheng dladm_status_t status; 1638da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1639da14cebeSEric Cheng datalink_class_t class; 1640da14cebeSEric Cheng 1641da14cebeSEric Cheng /* 1642da14cebeSEric Cheng * CPU bindings can be set on VNIC and regular physical links. 1643da14cebeSEric Cheng * However VNICs fails the dladm_phys_info test(). So apply 1644da14cebeSEric Cheng * the phys_info test only on physical links. 1645da14cebeSEric Cheng */ 16464ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, 1647da14cebeSEric Cheng NULL, NULL, 0)) != DLADM_STATUS_OK) { 1648da14cebeSEric Cheng return (status); 1649da14cebeSEric Cheng } 1650da14cebeSEric Cheng 1651da14cebeSEric Cheng /* 1652da14cebeSEric Cheng * We set intr_cpu to -1. The interrupt will be retargetted, 1653da14cebeSEric Cheng * if possible when the setup is complete in MAC. 1654da14cebeSEric Cheng */ 1655da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1656da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1657da14cebeSEric Cheng if (vdp != NULL && vdp->vd_val != RESET_VAL) { 1658da14cebeSEric Cheng mac_resource_props_t *vmrp; 1659da14cebeSEric Cheng 1660da14cebeSEric Cheng vmrp = (mac_resource_props_t *)vdp->vd_val; 1661da14cebeSEric Cheng if (vmrp->mrp_ncpus > 0) { 1662da14cebeSEric Cheng bcopy(vmrp, &mrp, sizeof (mac_resource_props_t)); 1663da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1664da14cebeSEric Cheng } 1665da14cebeSEric Cheng mrp.mrp_mask |= MRP_CPUS_USERSPEC; 1666da14cebeSEric Cheng mrp.mrp_fanout_mode = MCM_CPUS; 1667da14cebeSEric Cheng mrp.mrp_intr_cpu = -1; 1668da14cebeSEric Cheng } 1669da14cebeSEric Cheng 1670da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1671da14cebeSEric Cheng flags, &status); 1672da14cebeSEric Cheng if (dip == NULL) 1673da14cebeSEric Cheng return (status); 1674da14cebeSEric Cheng 1675da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 16764ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1677da14cebeSEric Cheng free(dip); 1678da14cebeSEric Cheng return (status); 1679da14cebeSEric Cheng } 1680da14cebeSEric Cheng 1681da14cebeSEric Cheng /* ARGSUSED */ 1682da14cebeSEric Cheng static dladm_status_t 16834ac67f02SAnurag S. Maskey do_check_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16844ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1685da14cebeSEric Cheng { 1686da14cebeSEric Cheng uint32_t cpuid; 1687da14cebeSEric Cheng int i, j, rc; 1688da14cebeSEric Cheng long nproc = sysconf(_SC_NPROCESSORS_CONF); 1689da14cebeSEric Cheng mac_resource_props_t *mrp; 1690da14cebeSEric Cheng 1691da14cebeSEric Cheng mrp = malloc(sizeof (mac_resource_props_t)); 1692da14cebeSEric Cheng if (mrp == NULL) 1693da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1694da14cebeSEric Cheng 1695da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1696da14cebeSEric Cheng errno = 0; 1697da14cebeSEric Cheng cpuid = strtol(prop_val[i], (char **)NULL, 10); 1698da14cebeSEric Cheng if (errno != 0 || cpuid >= nproc) { 1699da14cebeSEric Cheng free(mrp); 1700da14cebeSEric Cheng return (DLADM_STATUS_CPUMAX); 1701da14cebeSEric Cheng } 1702da14cebeSEric Cheng rc = p_online(cpuid, P_STATUS); 1703da14cebeSEric Cheng if (rc < 1) { 1704da14cebeSEric Cheng free(mrp); 1705da14cebeSEric Cheng return (DLADM_STATUS_CPUERR); 1706da14cebeSEric Cheng } 1707da14cebeSEric Cheng if (rc != P_ONLINE) { 1708da14cebeSEric Cheng free(mrp); 1709da14cebeSEric Cheng return (DLADM_STATUS_CPUNOTONLINE); 1710da14cebeSEric Cheng } 1711da14cebeSEric Cheng mrp->mrp_cpu[i] = cpuid; 1712da14cebeSEric Cheng } 1713da14cebeSEric Cheng mrp->mrp_ncpus = (uint32_t)val_cnt; 1714da14cebeSEric Cheng 1715da14cebeSEric Cheng /* Check for duplicates */ 1716da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1717da14cebeSEric Cheng for (j = 0; j < val_cnt; j++) { 1718da14cebeSEric Cheng if (i != j && mrp->mrp_cpu[i] == mrp->mrp_cpu[j]) { 1719da14cebeSEric Cheng free(mrp); 1720da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1721da14cebeSEric Cheng } 1722da14cebeSEric Cheng } 1723da14cebeSEric Cheng } 1724da14cebeSEric Cheng vdp->vd_val = (uintptr_t)mrp; 1725da14cebeSEric Cheng 1726da14cebeSEric Cheng return (DLADM_STATUS_OK); 1727da14cebeSEric Cheng } 1728da14cebeSEric Cheng 1729da14cebeSEric Cheng /* ARGSUSED */ 1730da14cebeSEric Cheng dladm_status_t 1731da14cebeSEric Cheng do_extract_cpus(val_desc_t *vdp, void *arg, uint_t cnt) 1732da14cebeSEric Cheng { 1733da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1734da14cebeSEric Cheng mac_resource_props_t *vmrp = (mac_resource_props_t *)vdp->vd_val; 1735da14cebeSEric Cheng int i; 1736da14cebeSEric Cheng 1737da14cebeSEric Cheng for (i = 0; i < vmrp->mrp_ncpus; i++) { 1738da14cebeSEric Cheng mrp->mrp_cpu[i] = vmrp->mrp_cpu[i]; 1739da14cebeSEric Cheng } 1740da14cebeSEric Cheng mrp->mrp_ncpus = vmrp->mrp_ncpus; 1741da14cebeSEric Cheng mrp->mrp_mask |= (MRP_CPUS|MRP_CPUS_USERSPEC); 1742da14cebeSEric Cheng mrp->mrp_fanout_mode = MCM_CPUS; 174363a6526dSMichael Lim mrp->mrp_intr_cpu = -1; 1744da14cebeSEric Cheng 1745da14cebeSEric Cheng return (DLADM_STATUS_OK); 1746da14cebeSEric Cheng } 1747da14cebeSEric Cheng 1748da14cebeSEric Cheng /* ARGSUSED */ 1749da14cebeSEric Cheng static dladm_status_t 175062ee1d25SArtem Kachitchkine i_dladm_priority_get(dladm_handle_t handle, prop_desc_t *pdp, 175162ee1d25SArtem Kachitchkine datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 175262ee1d25SArtem Kachitchkine datalink_media_t media, uint_t flags, uint_t *perm_flags) 1753da14cebeSEric Cheng { 1754da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1755da14cebeSEric Cheng mac_resource_props_t mrp; 1756da14cebeSEric Cheng mac_priority_level_t pri; 1757da14cebeSEric Cheng dladm_status_t status; 1758da14cebeSEric Cheng 17594ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1760da14cebeSEric Cheng &status, perm_flags); 1761da14cebeSEric Cheng if (dip == NULL) 1762da14cebeSEric Cheng return (status); 1763da14cebeSEric Cheng 1764da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1765da14cebeSEric Cheng free(dip); 1766da14cebeSEric Cheng 1767da14cebeSEric Cheng pri = ((mrp.mrp_mask & MRP_PRIORITY) == 0) ? MPL_HIGH : 1768da14cebeSEric Cheng mrp.mrp_priority; 1769da14cebeSEric Cheng 1770da14cebeSEric Cheng (void) dladm_pri2str(pri, prop_val[0]); 1771da14cebeSEric Cheng *val_cnt = 1; 1772da14cebeSEric Cheng return (DLADM_STATUS_OK); 1773da14cebeSEric Cheng } 1774da14cebeSEric Cheng 1775da14cebeSEric Cheng /* ARGSUSED */ 1776da14cebeSEric Cheng static dladm_status_t 17774ac67f02SAnurag S. Maskey do_check_priority(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 17784ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1779da14cebeSEric Cheng { 1780da14cebeSEric Cheng mac_priority_level_t *pri; 1781da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1782da14cebeSEric Cheng 1783da14cebeSEric Cheng if (val_cnt != 1) 1784da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1785da14cebeSEric Cheng 1786da14cebeSEric Cheng pri = malloc(sizeof (mac_priority_level_t)); 1787da14cebeSEric Cheng if (pri == NULL) 1788da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1789da14cebeSEric Cheng 1790da14cebeSEric Cheng status = dladm_str2pri(*prop_val, pri); 1791da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1792da14cebeSEric Cheng free(pri); 1793da14cebeSEric Cheng return (status); 1794da14cebeSEric Cheng } 1795da14cebeSEric Cheng 1796da14cebeSEric Cheng if (*pri < MPL_LOW || *pri > MPL_HIGH) { 1797da14cebeSEric Cheng free(pri); 1798da14cebeSEric Cheng return (DLADM_STATUS_BADVAL); 1799da14cebeSEric Cheng } 1800da14cebeSEric Cheng 1801da14cebeSEric Cheng vdp->vd_val = (uintptr_t)pri; 1802da14cebeSEric Cheng return (DLADM_STATUS_OK); 1803da14cebeSEric Cheng } 1804da14cebeSEric Cheng 1805da14cebeSEric Cheng /* ARGSUSED */ 1806da14cebeSEric Cheng dladm_status_t 1807da14cebeSEric Cheng do_extract_priority(val_desc_t *vdp, void *arg, uint_t cnt) 1808da14cebeSEric Cheng { 1809da14cebeSEric Cheng mac_resource_props_t *mrp = (mac_resource_props_t *)arg; 1810da14cebeSEric Cheng 1811da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_priority, 1812da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1813da14cebeSEric Cheng mrp->mrp_mask |= MRP_PRIORITY; 1814da14cebeSEric Cheng 1815da14cebeSEric Cheng return (DLADM_STATUS_OK); 1816da14cebeSEric Cheng } 1817da14cebeSEric Cheng 1818da14cebeSEric Cheng /* ARGSUSED */ 1819da14cebeSEric Cheng static dladm_status_t 18204ac67f02SAnurag S. Maskey do_get_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1821da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1822da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1823d62bc4baSyz147064 { 18243bc21d0aSAruna Ramakrishna - Sun Microsystems struct dlautopush dlap; 18253bc21d0aSAruna Ramakrishna - Sun Microsystems int i, len; 18263bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status; 18273bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1828d62bc4baSyz147064 18293fd94f8cSam223141 if (flags & MAC_PROP_DEFAULT) 1830149b7eb2SSowmini Varadhan return (DLADM_STATUS_NOTDEFINED); 18314045d941Ssowmini 1832d62bc4baSyz147064 *val_cnt = 1; 18334ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1834da14cebeSEric Cheng &status, perm_flags); 18353bc21d0aSAruna Ramakrishna - Sun Microsystems if (dip == NULL) { 1836d62bc4baSyz147064 (*prop_val)[0] = '\0'; 1837da14cebeSEric Cheng return (DLADM_STATUS_OK); 1838d62bc4baSyz147064 } 18393bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&dlap, dip->pr_val, sizeof (dlap)); 1840d62bc4baSyz147064 18413bc21d0aSAruna Ramakrishna - Sun Microsystems for (i = 0, len = 0; i < dlap.dap_npush; i++) { 1842d62bc4baSyz147064 if (i != 0) { 1843d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1844d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c", AP_DELIMITER); 1845d62bc4baSyz147064 len += 1; 1846d62bc4baSyz147064 } 1847d62bc4baSyz147064 (void) snprintf(*prop_val + len, DLADM_PROP_VAL_MAX - len, 18483bc21d0aSAruna Ramakrishna - Sun Microsystems "%s", dlap.dap_aplist[i]); 18493bc21d0aSAruna Ramakrishna - Sun Microsystems len += strlen(dlap.dap_aplist[i]); 18503bc21d0aSAruna Ramakrishna - Sun Microsystems if (dlap.dap_anchor - 1 == i) { 1851d62bc4baSyz147064 (void) snprintf(*prop_val + len, 1852d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c%s", AP_DELIMITER, 1853d62bc4baSyz147064 AP_ANCHOR); 1854d62bc4baSyz147064 len += (strlen(AP_ANCHOR) + 1); 1855d62bc4baSyz147064 } 1856d62bc4baSyz147064 } 18573bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1858d62bc4baSyz147064 done: 1859d62bc4baSyz147064 return (DLADM_STATUS_OK); 1860d62bc4baSyz147064 } 1861d62bc4baSyz147064 1862d62bc4baSyz147064 /* 1863d62bc4baSyz147064 * Add the specified module to the dlautopush structure; returns a 1864d62bc4baSyz147064 * DLADM_STATUS_* code. 1865d62bc4baSyz147064 */ 1866d62bc4baSyz147064 dladm_status_t 1867d62bc4baSyz147064 i_dladm_add_ap_module(const char *module, struct dlautopush *dlap) 1868d62bc4baSyz147064 { 1869d62bc4baSyz147064 if ((strlen(module) == 0) || (strlen(module) > FMNAMESZ)) 1870d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1871d62bc4baSyz147064 1872d62bc4baSyz147064 if (strncasecmp(module, AP_ANCHOR, strlen(AP_ANCHOR)) == 0) { 1873d62bc4baSyz147064 /* 1874d62bc4baSyz147064 * We don't allow multiple anchors, and the anchor must 1875d62bc4baSyz147064 * be after at least one module. 1876d62bc4baSyz147064 */ 1877d62bc4baSyz147064 if (dlap->dap_anchor != 0) 1878d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1879d62bc4baSyz147064 if (dlap->dap_npush == 0) 1880d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 1881d62bc4baSyz147064 1882d62bc4baSyz147064 dlap->dap_anchor = dlap->dap_npush; 1883d62bc4baSyz147064 return (DLADM_STATUS_OK); 1884d62bc4baSyz147064 } 1885285e94f9SMichael Lim if (dlap->dap_npush >= MAXAPUSH) 1886d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1887d62bc4baSyz147064 1888d62bc4baSyz147064 (void) strlcpy(dlap->dap_aplist[dlap->dap_npush++], module, 1889d62bc4baSyz147064 FMNAMESZ + 1); 1890d62bc4baSyz147064 1891d62bc4baSyz147064 return (DLADM_STATUS_OK); 1892d62bc4baSyz147064 } 1893d62bc4baSyz147064 1894d62bc4baSyz147064 /* 1895d62bc4baSyz147064 * Currently, both '.' and ' '(space) can be used as the delimiters between 1896d62bc4baSyz147064 * autopush modules. The former is used in dladm set-linkprop, and the 1897d62bc4baSyz147064 * latter is used in the autopush(1M) file. 1898d62bc4baSyz147064 */ 1899d62bc4baSyz147064 /* ARGSUSED */ 1900d62bc4baSyz147064 static dladm_status_t 19014ac67f02SAnurag S. Maskey do_check_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 19024ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1903d62bc4baSyz147064 { 1904d62bc4baSyz147064 char *module; 1905d62bc4baSyz147064 struct dlautopush *dlap; 1906d62bc4baSyz147064 dladm_status_t status; 1907d62bc4baSyz147064 char val[DLADM_PROP_VAL_MAX]; 1908d62bc4baSyz147064 char delimiters[4]; 1909d62bc4baSyz147064 1910d62bc4baSyz147064 if (val_cnt != 1) 1911d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 1912d62bc4baSyz147064 19133bc21d0aSAruna Ramakrishna - Sun Microsystems if (prop_val != NULL) { 1914d62bc4baSyz147064 dlap = malloc(sizeof (struct dlautopush)); 1915d62bc4baSyz147064 if (dlap == NULL) 1916d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 1917d62bc4baSyz147064 1918d62bc4baSyz147064 (void) memset(dlap, 0, sizeof (struct dlautopush)); 1919d62bc4baSyz147064 (void) snprintf(delimiters, 4, " %c\n", AP_DELIMITER); 1920d62bc4baSyz147064 bcopy(*prop_val, val, DLADM_PROP_VAL_MAX); 1921d62bc4baSyz147064 module = strtok(val, delimiters); 1922d62bc4baSyz147064 while (module != NULL) { 1923d62bc4baSyz147064 status = i_dladm_add_ap_module(module, dlap); 1924d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1925d62bc4baSyz147064 return (status); 1926d62bc4baSyz147064 module = strtok(NULL, delimiters); 1927d62bc4baSyz147064 } 1928d62bc4baSyz147064 1929d62bc4baSyz147064 vdp->vd_val = (uintptr_t)dlap; 19303bc21d0aSAruna Ramakrishna - Sun Microsystems } else { 19313bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = 0; 19323bc21d0aSAruna Ramakrishna - Sun Microsystems } 1933d62bc4baSyz147064 return (DLADM_STATUS_OK); 1934d62bc4baSyz147064 } 1935d62bc4baSyz147064 1936bcb5c89dSSowmini Varadhan #define WLDP_BUFSIZE (MAX_BUF_LEN - WIFI_BUF_OFFSET) 1937bcb5c89dSSowmini Varadhan 1938e7801d59Ssowmini /* ARGSUSED */ 1939d62bc4baSyz147064 static dladm_status_t 19404ac67f02SAnurag S. Maskey do_get_rate_common(dladm_handle_t handle, prop_desc_t *pdp, 19414ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id, 19424ac67f02SAnurag S. Maskey uint_t *perm_flags) 1943d62bc4baSyz147064 { 1944d62bc4baSyz147064 wl_rates_t *wrp; 1945d62bc4baSyz147064 uint_t i; 1946d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 1947d62bc4baSyz147064 1948bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 1949bcb5c89dSSowmini Varadhan if (wrp == NULL) 1950bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 1951d62bc4baSyz147064 19524ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE, 19534ac67f02SAnurag S. Maskey B_FALSE); 1954d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1955d62bc4baSyz147064 goto done; 1956d62bc4baSyz147064 1957d62bc4baSyz147064 if (wrp->wl_rates_num > *val_cnt) { 1958d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 1959d62bc4baSyz147064 goto done; 1960d62bc4baSyz147064 } 1961d62bc4baSyz147064 1962d62bc4baSyz147064 if (wrp->wl_rates_rates[0] == 0) { 1963d62bc4baSyz147064 prop_val[0][0] = '\0'; 1964d62bc4baSyz147064 *val_cnt = 1; 1965d62bc4baSyz147064 goto done; 1966d62bc4baSyz147064 } 1967d62bc4baSyz147064 1968d62bc4baSyz147064 for (i = 0; i < wrp->wl_rates_num; i++) { 1969d62bc4baSyz147064 (void) snprintf(prop_val[i], DLADM_STRSIZE, "%.*f", 1970d62bc4baSyz147064 wrp->wl_rates_rates[i] % 2, 1971d62bc4baSyz147064 (float)wrp->wl_rates_rates[i] / 2); 1972d62bc4baSyz147064 } 1973d62bc4baSyz147064 *val_cnt = wrp->wl_rates_num; 1974da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_RW; 1975d62bc4baSyz147064 1976d62bc4baSyz147064 done: 1977bcb5c89dSSowmini Varadhan free(wrp); 1978d62bc4baSyz147064 return (status); 1979d62bc4baSyz147064 } 1980d62bc4baSyz147064 1981d62bc4baSyz147064 static dladm_status_t 19824ac67f02SAnurag S. Maskey do_get_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1983da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1984da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1985d62bc4baSyz147064 { 1986afdda45fSVasumathi Sundaram - Sun Microsystems if (media != DL_WIFI) { 19874ac67f02SAnurag S. Maskey return (i_dladm_speed_get(handle, pdp, linkid, prop_val, 1988da14cebeSEric Cheng val_cnt, flags, perm_flags)); 1989afdda45fSVasumathi Sundaram - Sun Microsystems } 19906b9e797cSsowmini 19914ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, val_cnt, 1992da14cebeSEric Cheng MAC_PROP_WL_DESIRED_RATES, perm_flags)); 1993d62bc4baSyz147064 } 1994d62bc4baSyz147064 19954045d941Ssowmini /* ARGSUSED */ 1996d62bc4baSyz147064 static dladm_status_t 19974ac67f02SAnurag S. Maskey do_get_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1998da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1999da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2000d62bc4baSyz147064 { 20016b9e797cSsowmini switch (media) { 20026b9e797cSsowmini case DL_ETHER: 20034045d941Ssowmini /* 20044045d941Ssowmini * Speed for ethernet links is unbounded. E.g., 802.11b 20054045d941Ssowmini * links can have a speed of 5.5 Gbps. 20064045d941Ssowmini */ 20074045d941Ssowmini return (DLADM_STATUS_NOTSUP); 20086b9e797cSsowmini 20096b9e797cSsowmini case DL_WIFI: 20104ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, 20114ac67f02SAnurag S. Maskey val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); 20126b9e797cSsowmini default: 20136b9e797cSsowmini return (DLADM_STATUS_BADARG); 20146b9e797cSsowmini } 2015d62bc4baSyz147064 } 2016d62bc4baSyz147064 2017d62bc4baSyz147064 static dladm_status_t 20184ac67f02SAnurag S. Maskey do_set_rate(dladm_handle_t handle, datalink_id_t linkid, 20194ac67f02SAnurag S. Maskey dladm_wlan_rates_t *rates) 2020f4b3ec61Sdh155122 { 2021f4b3ec61Sdh155122 int i; 2022d62bc4baSyz147064 uint_t len; 2023d62bc4baSyz147064 wl_rates_t *wrp; 2024d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2025d62bc4baSyz147064 2026bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 2027bcb5c89dSSowmini Varadhan if (wrp == NULL) 2028d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 2029d62bc4baSyz147064 2030bcb5c89dSSowmini Varadhan bzero(wrp, WLDP_BUFSIZE); 2031d62bc4baSyz147064 for (i = 0; i < rates->wr_cnt; i++) 2032d62bc4baSyz147064 wrp->wl_rates_rates[i] = rates->wr_rates[i]; 2033d62bc4baSyz147064 wrp->wl_rates_num = rates->wr_cnt; 2034d62bc4baSyz147064 2035d62bc4baSyz147064 len = offsetof(wl_rates_t, wl_rates_rates) + 2036d62bc4baSyz147064 (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; 20374ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, 20384ac67f02SAnurag S. Maskey MAC_PROP_WL_DESIRED_RATES, len, B_TRUE); 2039d62bc4baSyz147064 2040bcb5c89dSSowmini Varadhan free(wrp); 2041d62bc4baSyz147064 return (status); 2042d62bc4baSyz147064 } 2043d62bc4baSyz147064 2044e7801d59Ssowmini /* ARGSUSED */ 2045d62bc4baSyz147064 static dladm_status_t 20464ac67f02SAnurag S. Maskey do_set_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 20476b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 2048d62bc4baSyz147064 { 2049d62bc4baSyz147064 dladm_wlan_rates_t rates; 2050f4b3ec61Sdh155122 dladm_status_t status; 2051f4b3ec61Sdh155122 20526b9e797cSsowmini /* 20536b9e797cSsowmini * can currently set rate on WIFI links only. 20546b9e797cSsowmini */ 20556b9e797cSsowmini if (media != DL_WIFI) 20566b9e797cSsowmini return (DLADM_STATUS_PROPRDONLY); 20576b9e797cSsowmini 2058d62bc4baSyz147064 if (val_cnt != 1) 2059d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2060f4b3ec61Sdh155122 2061d62bc4baSyz147064 rates.wr_cnt = 1; 2062d62bc4baSyz147064 rates.wr_rates[0] = vdp[0].vd_val; 2063f4b3ec61Sdh155122 20644ac67f02SAnurag S. Maskey status = do_set_rate(handle, linkid, &rates); 2065f4b3ec61Sdh155122 2066d62bc4baSyz147064 done: 2067d62bc4baSyz147064 return (status); 2068d62bc4baSyz147064 } 2069d62bc4baSyz147064 2070d62bc4baSyz147064 /* ARGSUSED */ 2071d62bc4baSyz147064 static dladm_status_t 20724ac67f02SAnurag S. Maskey do_check_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 20734ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 2074d62bc4baSyz147064 { 2075d62bc4baSyz147064 int i; 2076d62bc4baSyz147064 uint_t modval_cnt = MAX_SUPPORT_RATES; 2077d62bc4baSyz147064 char *buf, **modval; 2078d62bc4baSyz147064 dladm_status_t status; 2079afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 2080d62bc4baSyz147064 2081d62bc4baSyz147064 if (val_cnt != 1) 2082d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2083d62bc4baSyz147064 2084d62bc4baSyz147064 buf = malloc((sizeof (char *) + DLADM_STRSIZE) * 2085d62bc4baSyz147064 MAX_SUPPORT_RATES); 2086d62bc4baSyz147064 if (buf == NULL) { 2087d62bc4baSyz147064 status = DLADM_STATUS_NOMEM; 2088d62bc4baSyz147064 goto done; 2089d62bc4baSyz147064 } 2090d62bc4baSyz147064 2091d62bc4baSyz147064 modval = (char **)(void *)buf; 2092d62bc4baSyz147064 for (i = 0; i < MAX_SUPPORT_RATES; i++) { 2093d62bc4baSyz147064 modval[i] = buf + sizeof (char *) * MAX_SUPPORT_RATES + 2094d62bc4baSyz147064 i * DLADM_STRSIZE; 2095d62bc4baSyz147064 } 2096d62bc4baSyz147064 20974ac67f02SAnurag S. Maskey status = do_get_rate_mod(handle, NULL, linkid, modval, &modval_cnt, 20984ac67f02SAnurag S. Maskey media, 0, &perm_flags); 2099d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2100d62bc4baSyz147064 goto done; 2101d62bc4baSyz147064 2102d62bc4baSyz147064 for (i = 0; i < modval_cnt; i++) { 2103d62bc4baSyz147064 if (strcasecmp(*prop_val, modval[i]) == 0) { 2104e7801d59Ssowmini vdp->vd_val = (uintptr_t)(uint_t) 2105e7801d59Ssowmini (atof(*prop_val) * 2); 2106f4b3ec61Sdh155122 status = DLADM_STATUS_OK; 2107f4b3ec61Sdh155122 break; 2108f4b3ec61Sdh155122 } 2109d62bc4baSyz147064 } 2110d62bc4baSyz147064 if (i == modval_cnt) 2111d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 2112d62bc4baSyz147064 done: 2113d62bc4baSyz147064 free(buf); 2114d62bc4baSyz147064 return (status); 2115d62bc4baSyz147064 } 2116f4b3ec61Sdh155122 2117d62bc4baSyz147064 static dladm_status_t 21184ac67f02SAnurag S. Maskey do_get_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf, 21194ac67f02SAnurag S. Maskey int buflen) 2120d62bc4baSyz147064 { 21214ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, 2122bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2123d62bc4baSyz147064 } 2124d62bc4baSyz147064 2125e7801d59Ssowmini /* ARGSUSED */ 2126d62bc4baSyz147064 static dladm_status_t 21274ac67f02SAnurag S. Maskey do_get_channel_prop(dladm_handle_t handle, prop_desc_t *pdp, 21284ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 21294ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2130d62bc4baSyz147064 { 2131d62bc4baSyz147064 uint32_t channel; 2132bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2133d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2134bcb5c89dSSowmini Varadhan wl_phy_conf_t wl_phy_conf; 2135d62bc4baSyz147064 21364ac67f02SAnurag S. Maskey if ((status = do_get_phyconf(handle, linkid, buf, sizeof (buf))) 2137bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2138d62bc4baSyz147064 goto done; 2139d62bc4baSyz147064 2140bcb5c89dSSowmini Varadhan (void) memcpy(&wl_phy_conf, buf, sizeof (wl_phy_conf)); 2141bcb5c89dSSowmini Varadhan if (!i_dladm_wlan_convert_chan(&wl_phy_conf, &channel)) { 2142d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2143d62bc4baSyz147064 goto done; 2144d62bc4baSyz147064 } 2145d62bc4baSyz147064 2146d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel); 2147d62bc4baSyz147064 *val_cnt = 1; 2148da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2149d62bc4baSyz147064 done: 2150d62bc4baSyz147064 return (status); 2151d62bc4baSyz147064 } 2152d62bc4baSyz147064 2153d62bc4baSyz147064 static dladm_status_t 21544ac67f02SAnurag S. Maskey do_get_powermode(dladm_handle_t handle, datalink_id_t linkid, void *buf, 21554ac67f02SAnurag S. Maskey int buflen) 2156d62bc4baSyz147064 { 21574ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_POWER_MODE, 2158bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2159d62bc4baSyz147064 } 2160d62bc4baSyz147064 2161e7801d59Ssowmini /* ARGSUSED */ 2162d62bc4baSyz147064 static dladm_status_t 21634ac67f02SAnurag S. Maskey do_get_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 21644ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 21654ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2166d62bc4baSyz147064 { 2167bcb5c89dSSowmini Varadhan wl_ps_mode_t mode; 2168d62bc4baSyz147064 const char *s; 2169bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2170d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2171d62bc4baSyz147064 21724ac67f02SAnurag S. Maskey if ((status = do_get_powermode(handle, linkid, buf, sizeof (buf))) 2173bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2174d62bc4baSyz147064 goto done; 2175d62bc4baSyz147064 2176bcb5c89dSSowmini Varadhan (void) memcpy(&mode, buf, sizeof (mode)); 2177bcb5c89dSSowmini Varadhan switch (mode.wl_ps_mode) { 2178d62bc4baSyz147064 case WL_PM_AM: 2179d62bc4baSyz147064 s = "off"; 2180f4b3ec61Sdh155122 break; 2181d62bc4baSyz147064 case WL_PM_MPS: 2182d62bc4baSyz147064 s = "max"; 2183d62bc4baSyz147064 break; 2184d62bc4baSyz147064 case WL_PM_FAST: 2185d62bc4baSyz147064 s = "fast"; 2186f4b3ec61Sdh155122 break; 2187f4b3ec61Sdh155122 default: 2188d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2189d62bc4baSyz147064 goto done; 2190f4b3ec61Sdh155122 } 2191d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2192d62bc4baSyz147064 *val_cnt = 1; 2193afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2194da14cebeSEric Cheng done: 2195d62bc4baSyz147064 return (status); 2196d62bc4baSyz147064 } 2197d62bc4baSyz147064 2198d62bc4baSyz147064 static dladm_status_t 21994ac67f02SAnurag S. Maskey do_set_powermode(dladm_handle_t handle, datalink_id_t linkid, 22004ac67f02SAnurag S. Maskey dladm_wlan_powermode_t *pm) 2201d62bc4baSyz147064 { 2202d62bc4baSyz147064 wl_ps_mode_t ps_mode; 2203d62bc4baSyz147064 2204d62bc4baSyz147064 (void) memset(&ps_mode, 0xff, sizeof (ps_mode)); 2205d62bc4baSyz147064 2206d62bc4baSyz147064 switch (*pm) { 2207d62bc4baSyz147064 case DLADM_WLAN_PM_OFF: 2208d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_AM; 2209d62bc4baSyz147064 break; 2210d62bc4baSyz147064 case DLADM_WLAN_PM_MAX: 2211d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_MPS; 2212d62bc4baSyz147064 break; 2213d62bc4baSyz147064 case DLADM_WLAN_PM_FAST: 2214d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_FAST; 2215d62bc4baSyz147064 break; 2216d62bc4baSyz147064 default: 2217d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2218d62bc4baSyz147064 } 22194ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &ps_mode, 22204ac67f02SAnurag S. Maskey MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE)); 2221d62bc4baSyz147064 } 2222d62bc4baSyz147064 2223d62bc4baSyz147064 /* ARGSUSED */ 2224d62bc4baSyz147064 static dladm_status_t 22254ac67f02SAnurag S. Maskey do_set_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 22264ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 22274ac67f02SAnurag S. Maskey datalink_media_t media) 2228d62bc4baSyz147064 { 2229d62bc4baSyz147064 dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; 2230d62bc4baSyz147064 dladm_status_t status; 2231d62bc4baSyz147064 2232d62bc4baSyz147064 if (val_cnt != 1) 2233d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2234d62bc4baSyz147064 22354ac67f02SAnurag S. Maskey status = do_set_powermode(handle, linkid, &powermode); 2236f4b3ec61Sdh155122 2237f4b3ec61Sdh155122 return (status); 2238f4b3ec61Sdh155122 } 2239f4b3ec61Sdh155122 2240f4b3ec61Sdh155122 static dladm_status_t 22414ac67f02SAnurag S. Maskey do_get_radio(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) 2242f4b3ec61Sdh155122 { 22434ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RADIO, 22444ac67f02SAnurag S. Maskey buflen, B_FALSE)); 2245d62bc4baSyz147064 } 2246d62bc4baSyz147064 2247e7801d59Ssowmini /* ARGSUSED */ 2248d62bc4baSyz147064 static dladm_status_t 22494ac67f02SAnurag S. Maskey do_get_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2250da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2251da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2252d62bc4baSyz147064 { 2253d62bc4baSyz147064 wl_radio_t radio; 2254d62bc4baSyz147064 const char *s; 2255bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2256d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2257d62bc4baSyz147064 22584ac67f02SAnurag S. Maskey if ((status = do_get_radio(handle, linkid, buf, sizeof (buf))) 2259bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2260d62bc4baSyz147064 goto done; 2261d62bc4baSyz147064 2262bcb5c89dSSowmini Varadhan (void) memcpy(&radio, buf, sizeof (radio)); 2263d62bc4baSyz147064 switch (radio) { 2264d62bc4baSyz147064 case B_TRUE: 2265d62bc4baSyz147064 s = "on"; 2266d62bc4baSyz147064 break; 2267d62bc4baSyz147064 case B_FALSE: 2268d62bc4baSyz147064 s = "off"; 2269d62bc4baSyz147064 break; 2270d62bc4baSyz147064 default: 2271d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2272d62bc4baSyz147064 goto done; 2273d62bc4baSyz147064 } 2274d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2275d62bc4baSyz147064 *val_cnt = 1; 2276afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2277da14cebeSEric Cheng done: 2278d62bc4baSyz147064 return (status); 2279d62bc4baSyz147064 } 2280d62bc4baSyz147064 2281d62bc4baSyz147064 static dladm_status_t 22824ac67f02SAnurag S. Maskey do_set_radio(dladm_handle_t handle, datalink_id_t linkid, 22834ac67f02SAnurag S. Maskey dladm_wlan_radio_t *radio) 2284d62bc4baSyz147064 { 2285d62bc4baSyz147064 wl_radio_t r; 2286d62bc4baSyz147064 2287d62bc4baSyz147064 switch (*radio) { 2288d62bc4baSyz147064 case DLADM_WLAN_RADIO_ON: 2289d62bc4baSyz147064 r = B_TRUE; 2290d62bc4baSyz147064 break; 2291d62bc4baSyz147064 case DLADM_WLAN_RADIO_OFF: 2292d62bc4baSyz147064 r = B_FALSE; 2293d62bc4baSyz147064 break; 2294d62bc4baSyz147064 default: 2295d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2296d62bc4baSyz147064 } 22974ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO, 2298bcb5c89dSSowmini Varadhan sizeof (r), B_TRUE)); 2299d62bc4baSyz147064 } 2300d62bc4baSyz147064 2301d62bc4baSyz147064 /* ARGSUSED */ 2302d62bc4baSyz147064 static dladm_status_t 23034ac67f02SAnurag S. Maskey do_set_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2304*2b24ab6bSSebastien Roy val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 2305d62bc4baSyz147064 { 2306d62bc4baSyz147064 dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; 2307f4b3ec61Sdh155122 dladm_status_t status; 2308f4b3ec61Sdh155122 2309d62bc4baSyz147064 if (val_cnt != 1) 2310d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2311f4b3ec61Sdh155122 23124ac67f02SAnurag S. Maskey status = do_set_radio(handle, linkid, &radio); 2313f4b3ec61Sdh155122 2314d62bc4baSyz147064 return (status); 2315d62bc4baSyz147064 } 2316f4b3ec61Sdh155122 2317*2b24ab6bSSebastien Roy /* ARGSUSED */ 2318*2b24ab6bSSebastien Roy static dladm_status_t 2319*2b24ab6bSSebastien Roy do_check_hoplimit(dladm_handle_t handle, prop_desc_t *pdp, 2320*2b24ab6bSSebastien Roy datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 2321*2b24ab6bSSebastien Roy datalink_media_t media) 2322*2b24ab6bSSebastien Roy { 2323*2b24ab6bSSebastien Roy int32_t hlim; 2324*2b24ab6bSSebastien Roy char *ep; 2325*2b24ab6bSSebastien Roy 2326*2b24ab6bSSebastien Roy if (val_cnt != 1) 2327*2b24ab6bSSebastien Roy return (DLADM_STATUS_BADVALCNT); 2328*2b24ab6bSSebastien Roy 2329*2b24ab6bSSebastien Roy errno = 0; 2330*2b24ab6bSSebastien Roy hlim = strtol(*prop_val, &ep, 10); 2331*2b24ab6bSSebastien Roy if (errno != 0 || ep == *prop_val || hlim < 1 || 2332*2b24ab6bSSebastien Roy hlim > (int32_t)UINT8_MAX) 2333*2b24ab6bSSebastien Roy return (DLADM_STATUS_BADVAL); 2334*2b24ab6bSSebastien Roy vdp->vd_val = hlim; 2335*2b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 2336*2b24ab6bSSebastien Roy } 2337*2b24ab6bSSebastien Roy 2338*2b24ab6bSSebastien Roy /* ARGSUSED */ 2339*2b24ab6bSSebastien Roy static dladm_status_t 2340*2b24ab6bSSebastien Roy do_check_encaplim(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2341*2b24ab6bSSebastien Roy char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 2342*2b24ab6bSSebastien Roy { 2343*2b24ab6bSSebastien Roy int32_t elim; 2344*2b24ab6bSSebastien Roy char *ep; 2345*2b24ab6bSSebastien Roy 2346*2b24ab6bSSebastien Roy if (media != DL_IPV6) 2347*2b24ab6bSSebastien Roy return (DLADM_STATUS_BADARG); 2348*2b24ab6bSSebastien Roy 2349*2b24ab6bSSebastien Roy if (val_cnt != 1) 2350*2b24ab6bSSebastien Roy return (DLADM_STATUS_BADVALCNT); 2351*2b24ab6bSSebastien Roy 2352*2b24ab6bSSebastien Roy errno = 0; 2353*2b24ab6bSSebastien Roy elim = strtol(*prop_val, &ep, 10); 2354*2b24ab6bSSebastien Roy if (errno != 0 || ep == *prop_val || elim < 0 || 2355*2b24ab6bSSebastien Roy elim > (int32_t)UINT8_MAX) 2356*2b24ab6bSSebastien Roy return (DLADM_STATUS_BADVAL); 2357*2b24ab6bSSebastien Roy vdp->vd_val = elim; 2358*2b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 2359*2b24ab6bSSebastien Roy } 2360*2b24ab6bSSebastien Roy 2361d62bc4baSyz147064 static dladm_status_t 23624ac67f02SAnurag S. Maskey i_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 23634ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt) 2364d62bc4baSyz147064 { 2365d62bc4baSyz147064 char buf[MAXLINELEN]; 2366d62bc4baSyz147064 int i; 2367d62bc4baSyz147064 dladm_conf_t conf; 2368d62bc4baSyz147064 dladm_status_t status; 2369d62bc4baSyz147064 23704ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2371f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 2372f4b3ec61Sdh155122 return (status); 2373f4b3ec61Sdh155122 2374d62bc4baSyz147064 /* 2375d62bc4baSyz147064 * reset case. 2376d62bc4baSyz147064 */ 2377d62bc4baSyz147064 if (val_cnt == 0) { 23784ac67f02SAnurag S. Maskey status = dladm_unset_conf_field(handle, conf, prop_name); 2379d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 23804ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2381d62bc4baSyz147064 goto done; 2382f4b3ec61Sdh155122 } 2383f4b3ec61Sdh155122 2384d62bc4baSyz147064 buf[0] = '\0'; 2385d62bc4baSyz147064 for (i = 0; i < val_cnt; i++) { 2386d62bc4baSyz147064 (void) strlcat(buf, prop_val[i], MAXLINELEN); 2387d62bc4baSyz147064 if (i != val_cnt - 1) 2388d62bc4baSyz147064 (void) strlcat(buf, ",", MAXLINELEN); 2389d62bc4baSyz147064 } 2390f4b3ec61Sdh155122 23914ac67f02SAnurag S. Maskey status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR, 23924ac67f02SAnurag S. Maskey buf); 2393d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 23944ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2395d62bc4baSyz147064 2396d62bc4baSyz147064 done: 23974ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2398f4b3ec61Sdh155122 return (status); 2399f4b3ec61Sdh155122 } 2400f4b3ec61Sdh155122 2401f4b3ec61Sdh155122 static dladm_status_t 24024ac67f02SAnurag S. Maskey i_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 24034ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cntp) 2404f4b3ec61Sdh155122 { 2405d62bc4baSyz147064 char buf[MAXLINELEN], *str; 2406d62bc4baSyz147064 uint_t cnt = 0; 2407d62bc4baSyz147064 dladm_conf_t conf; 2408d62bc4baSyz147064 dladm_status_t status; 2409f4b3ec61Sdh155122 24104ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2411d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2412f4b3ec61Sdh155122 return (status); 2413d62bc4baSyz147064 24144ac67f02SAnurag S. Maskey status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN); 2415d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2416d62bc4baSyz147064 goto done; 2417d62bc4baSyz147064 2418d62bc4baSyz147064 str = strtok(buf, ","); 2419d62bc4baSyz147064 while (str != NULL) { 2420d62bc4baSyz147064 if (cnt == *val_cntp) { 2421d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2422d62bc4baSyz147064 goto done; 2423d62bc4baSyz147064 } 2424d62bc4baSyz147064 (void) strlcpy(prop_val[cnt++], str, DLADM_PROP_VAL_MAX); 2425d62bc4baSyz147064 str = strtok(NULL, ","); 2426f4b3ec61Sdh155122 } 2427f4b3ec61Sdh155122 2428d62bc4baSyz147064 *val_cntp = cnt; 2429f4b3ec61Sdh155122 2430d62bc4baSyz147064 done: 24314ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2432d62bc4baSyz147064 return (status); 2433f4b3ec61Sdh155122 } 2434e7801d59Ssowmini 243562ee1d25SArtem Kachitchkine /* 243662ee1d25SArtem Kachitchkine * Walk persistent private link properties of a link. 243762ee1d25SArtem Kachitchkine */ 243862ee1d25SArtem Kachitchkine static dladm_status_t 243962ee1d25SArtem Kachitchkine i_dladm_walk_linkprop_priv_db(dladm_handle_t handle, datalink_id_t linkid, 244062ee1d25SArtem Kachitchkine void *arg, int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 244162ee1d25SArtem Kachitchkine { 244262ee1d25SArtem Kachitchkine dladm_status_t status; 244362ee1d25SArtem Kachitchkine dladm_conf_t conf; 244462ee1d25SArtem Kachitchkine char last_attr[MAXLINKATTRLEN]; 244562ee1d25SArtem Kachitchkine char attr[MAXLINKATTRLEN]; 244662ee1d25SArtem Kachitchkine char attrval[MAXLINKATTRVALLEN]; 244762ee1d25SArtem Kachitchkine size_t attrsz; 244862ee1d25SArtem Kachitchkine 244962ee1d25SArtem Kachitchkine if (linkid == DATALINK_INVALID_LINKID || func == NULL) 245062ee1d25SArtem Kachitchkine return (DLADM_STATUS_BADARG); 245162ee1d25SArtem Kachitchkine 245262ee1d25SArtem Kachitchkine status = dladm_read_conf(handle, linkid, &conf); 245362ee1d25SArtem Kachitchkine if (status != DLADM_STATUS_OK) 245462ee1d25SArtem Kachitchkine return (status); 245562ee1d25SArtem Kachitchkine 245662ee1d25SArtem Kachitchkine last_attr[0] = '\0'; 245762ee1d25SArtem Kachitchkine while ((status = dladm_getnext_conf_linkprop(handle, conf, last_attr, 245862ee1d25SArtem Kachitchkine attr, attrval, MAXLINKATTRVALLEN, &attrsz)) == DLADM_STATUS_OK) { 245962ee1d25SArtem Kachitchkine if (attr[0] == '_') { 246062ee1d25SArtem Kachitchkine if (func(handle, linkid, attr, arg) == 246162ee1d25SArtem Kachitchkine DLADM_WALK_TERMINATE) 246262ee1d25SArtem Kachitchkine break; 246362ee1d25SArtem Kachitchkine } 246462ee1d25SArtem Kachitchkine (void) strlcpy(last_attr, attr, MAXLINKATTRLEN); 246562ee1d25SArtem Kachitchkine } 246662ee1d25SArtem Kachitchkine 246762ee1d25SArtem Kachitchkine dladm_destroy_conf(handle, conf); 246862ee1d25SArtem Kachitchkine return (DLADM_STATUS_OK); 246962ee1d25SArtem Kachitchkine } 247062ee1d25SArtem Kachitchkine 2471bcb5c89dSSowmini Varadhan static link_attr_t * 2472e7801d59Ssowmini dladm_name2prop(const char *prop_name) 2473e7801d59Ssowmini { 2474bcb5c89dSSowmini Varadhan link_attr_t *p; 2475e7801d59Ssowmini 2476bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2477e7801d59Ssowmini if (strcmp(p->pp_name, prop_name) == 0) 2478e7801d59Ssowmini break; 2479e7801d59Ssowmini } 2480e7801d59Ssowmini return (p); 2481e7801d59Ssowmini } 2482e7801d59Ssowmini 2483bcb5c89dSSowmini Varadhan static link_attr_t * 2484bcb5c89dSSowmini Varadhan dladm_id2prop(mac_prop_id_t propid) 2485bcb5c89dSSowmini Varadhan { 2486bcb5c89dSSowmini Varadhan link_attr_t *p; 2487bcb5c89dSSowmini Varadhan 2488bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2489bcb5c89dSSowmini Varadhan if (p->pp_id == propid) 2490bcb5c89dSSowmini Varadhan break; 2491bcb5c89dSSowmini Varadhan } 2492bcb5c89dSSowmini Varadhan return (p); 2493bcb5c89dSSowmini Varadhan } 2494e7801d59Ssowmini 24953fd94f8cSam223141 static dld_ioc_macprop_t * 2496bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_impl(size_t valsize, datalink_id_t linkid, 2497bcb5c89dSSowmini Varadhan const char *prop_name, mac_prop_id_t propid, uint_t flags, 2498bcb5c89dSSowmini Varadhan dladm_status_t *status) 2499e7801d59Ssowmini { 2500e7801d59Ssowmini int dsize; 25013fd94f8cSam223141 dld_ioc_macprop_t *dip; 2502e7801d59Ssowmini 2503e7801d59Ssowmini *status = DLADM_STATUS_OK; 25043fd94f8cSam223141 dsize = MAC_PROP_BUFSIZE(valsize); 2505e7801d59Ssowmini dip = malloc(dsize); 2506e7801d59Ssowmini if (dip == NULL) { 2507e7801d59Ssowmini *status = DLADM_STATUS_NOMEM; 2508e7801d59Ssowmini return (NULL); 2509e7801d59Ssowmini } 2510e7801d59Ssowmini bzero(dip, dsize); 2511e7801d59Ssowmini dip->pr_valsize = valsize; 25124045d941Ssowmini (void) strlcpy(dip->pr_name, prop_name, sizeof (dip->pr_name)); 25133fd94f8cSam223141 dip->pr_version = MAC_PROP_VERSION; 25146b9e797cSsowmini dip->pr_linkid = linkid; 2515bcb5c89dSSowmini Varadhan dip->pr_num = propid; 25164045d941Ssowmini dip->pr_flags = flags; 2517e7801d59Ssowmini return (dip); 2518e7801d59Ssowmini } 2519e7801d59Ssowmini 2520bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2521bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_name(size_t valsize, datalink_id_t linkid, 2522bcb5c89dSSowmini Varadhan const char *prop_name, uint_t flags, dladm_status_t *status) 2523bcb5c89dSSowmini Varadhan { 2524bcb5c89dSSowmini Varadhan link_attr_t *p; 2525bcb5c89dSSowmini Varadhan 2526bcb5c89dSSowmini Varadhan p = dladm_name2prop(prop_name); 2527bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2528bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, prop_name, p->pp_id, 2529bcb5c89dSSowmini Varadhan flags, status)); 2530bcb5c89dSSowmini Varadhan } 2531bcb5c89dSSowmini Varadhan 2532bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2533bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid, 2534bcb5c89dSSowmini Varadhan mac_prop_id_t propid, uint_t flags, dladm_status_t *status) 2535bcb5c89dSSowmini Varadhan { 2536bcb5c89dSSowmini Varadhan link_attr_t *p; 2537bcb5c89dSSowmini Varadhan 2538bcb5c89dSSowmini Varadhan p = dladm_id2prop(propid); 2539bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2540bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, p->pp_name, propid, 2541bcb5c89dSSowmini Varadhan flags, status)); 2542bcb5c89dSSowmini Varadhan } 2543bcb5c89dSSowmini Varadhan 2544e7801d59Ssowmini /* ARGSUSED */ 2545e7801d59Ssowmini static dladm_status_t 25464ac67f02SAnurag S. Maskey i_dladm_set_public_prop(dladm_handle_t handle, prop_desc_t *pdp, 25474ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 25484ac67f02SAnurag S. Maskey datalink_media_t media) 2549e7801d59Ssowmini { 25503fd94f8cSam223141 dld_ioc_macprop_t *dip; 2551e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2552e7801d59Ssowmini uint8_t u8; 2553e7801d59Ssowmini uint16_t u16; 2554e7801d59Ssowmini uint32_t u32; 2555e7801d59Ssowmini void *val; 2556e7801d59Ssowmini 2557da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 0, &status); 2558e7801d59Ssowmini if (dip == NULL) 2559e7801d59Ssowmini return (status); 2560e7801d59Ssowmini 2561da14cebeSEric Cheng if (pdp->pd_flags & PD_CHECK_ALLOC) 2562e7801d59Ssowmini val = (void *)vdp->vd_val; 2563e7801d59Ssowmini else { 2564e7801d59Ssowmini /* 2565e7801d59Ssowmini * Currently all 1/2/4-byte size properties are byte/word/int. 2566e7801d59Ssowmini * No need (yet) to distinguish these from arrays of same size. 2567e7801d59Ssowmini */ 2568e7801d59Ssowmini switch (dip->pr_valsize) { 2569e7801d59Ssowmini case 1: 2570e7801d59Ssowmini u8 = vdp->vd_val; 2571e7801d59Ssowmini val = &u8; 2572e7801d59Ssowmini break; 2573e7801d59Ssowmini case 2: 2574e7801d59Ssowmini u16 = vdp->vd_val; 2575e7801d59Ssowmini val = &u16; 2576e7801d59Ssowmini break; 2577e7801d59Ssowmini case 4: 2578e7801d59Ssowmini u32 = vdp->vd_val; 2579e7801d59Ssowmini val = &u32; 2580e7801d59Ssowmini break; 2581e7801d59Ssowmini default: 2582e7801d59Ssowmini val = &vdp->vd_val; 2583e7801d59Ssowmini break; 2584e7801d59Ssowmini } 2585e7801d59Ssowmini } 2586e7801d59Ssowmini 25873bc21d0aSAruna Ramakrishna - Sun Microsystems if (val != NULL) 2588e7801d59Ssowmini (void) memcpy(dip->pr_val, val, dip->pr_valsize); 25893bc21d0aSAruna Ramakrishna - Sun Microsystems else 25903bc21d0aSAruna Ramakrishna - Sun Microsystems dip->pr_valsize = 0; 25913bc21d0aSAruna Ramakrishna - Sun Microsystems 25924ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 2593bcb5c89dSSowmini Varadhan 2594bcb5c89dSSowmini Varadhan done: 2595bcb5c89dSSowmini Varadhan free(dip); 2596bcb5c89dSSowmini Varadhan return (status); 2597bcb5c89dSSowmini Varadhan } 2598bcb5c89dSSowmini Varadhan 2599bcb5c89dSSowmini Varadhan dladm_status_t 26004ac67f02SAnurag S. Maskey i_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set) 2601bcb5c89dSSowmini Varadhan { 2602bcb5c89dSSowmini Varadhan dladm_status_t status = DLADM_STATUS_OK; 2603bcb5c89dSSowmini Varadhan 26044ac67f02SAnurag S. Maskey if (ioctl(dladm_dld_fd(handle), 26054ac67f02SAnurag S. Maskey (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) 2606e7801d59Ssowmini status = dladm_errno2status(errno); 2607e7801d59Ssowmini 2608e7801d59Ssowmini return (status); 2609e7801d59Ssowmini } 2610e7801d59Ssowmini 26113fd94f8cSam223141 static dld_ioc_macprop_t * 26124ac67f02SAnurag S. Maskey i_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid, 26134ac67f02SAnurag S. Maskey char *prop_name, uint_t flags, dladm_status_t *status, uint_t *perm_flags) 2614e7801d59Ssowmini { 26153fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 26164045d941Ssowmini 2617bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(0, linkid, prop_name, flags, status); 26184045d941Ssowmini if (dip == NULL) 26194045d941Ssowmini return (NULL); 2620e7801d59Ssowmini 26214ac67f02SAnurag S. Maskey *status = i_dladm_macprop(handle, dip, B_FALSE); 26224045d941Ssowmini if (*status != DLADM_STATUS_OK) { 26234045d941Ssowmini free(dip); 26244045d941Ssowmini return (NULL); 26254045d941Ssowmini } 2626da14cebeSEric Cheng if (perm_flags != NULL) 2627da14cebeSEric Cheng *perm_flags = dip->pr_perm_flags; 2628da14cebeSEric Cheng 26294045d941Ssowmini return (dip); 2630e7801d59Ssowmini } 2631e7801d59Ssowmini 2632e7801d59Ssowmini /* ARGSUSED */ 2633e7801d59Ssowmini static dladm_status_t 26344eaa4710SRishi Srivatsavai i_dladm_uint32_check(dladm_handle_t handle, prop_desc_t *pdp, 26354ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *v, 26364ac67f02SAnurag S. Maskey datalink_media_t media) 2637e7801d59Ssowmini { 2638e7801d59Ssowmini if (val_cnt != 1) 2639e7801d59Ssowmini return (DLADM_STATUS_BADVAL); 26404eaa4710SRishi Srivatsavai v->vd_val = strtoul(prop_val[0], NULL, 0); 2641e7801d59Ssowmini return (DLADM_STATUS_OK); 2642e7801d59Ssowmini } 2643e7801d59Ssowmini 2644e7801d59Ssowmini /* ARGSUSED */ 2645e7801d59Ssowmini static dladm_status_t 26464ac67f02SAnurag S. Maskey i_dladm_duplex_get(dladm_handle_t handle, prop_desc_t *pdp, 26474ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 26484ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2649e7801d59Ssowmini { 2650e7801d59Ssowmini link_duplex_t link_duplex; 2651e7801d59Ssowmini dladm_status_t status; 2652e7801d59Ssowmini 26534ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", 2654e7801d59Ssowmini KSTAT_DATA_UINT32, &link_duplex)) != 0) 2655e7801d59Ssowmini return (status); 2656e7801d59Ssowmini 2657e7801d59Ssowmini switch (link_duplex) { 2658e7801d59Ssowmini case LINK_DUPLEX_FULL: 2659e7801d59Ssowmini (void) strcpy(*prop_val, "full"); 2660e7801d59Ssowmini break; 2661e7801d59Ssowmini case LINK_DUPLEX_HALF: 2662e7801d59Ssowmini (void) strcpy(*prop_val, "half"); 2663e7801d59Ssowmini break; 2664e7801d59Ssowmini default: 2665e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2666e7801d59Ssowmini break; 2667e7801d59Ssowmini } 2668e7801d59Ssowmini *val_cnt = 1; 2669e7801d59Ssowmini return (DLADM_STATUS_OK); 2670e7801d59Ssowmini } 2671e7801d59Ssowmini 2672e7801d59Ssowmini /* ARGSUSED */ 2673e7801d59Ssowmini static dladm_status_t 26744ac67f02SAnurag S. Maskey i_dladm_speed_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2675da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, uint_t flags, uint_t *perm_flags) 2676e7801d59Ssowmini { 2677e7801d59Ssowmini uint64_t ifspeed = 0; 2678e7801d59Ssowmini dladm_status_t status; 2679e7801d59Ssowmini 26804ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", 2681e7801d59Ssowmini KSTAT_DATA_UINT64, &ifspeed)) != 0) 2682e7801d59Ssowmini return (status); 26834045d941Ssowmini 26846b9e797cSsowmini if ((ifspeed % 1000000) != 0) { 26856b9e797cSsowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 26866b9e797cSsowmini "%llf", ifspeed / (float)1000000); /* Mbps */ 26876b9e797cSsowmini } else { 2688e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 2689e7801d59Ssowmini "%llu", ifspeed / 1000000); /* Mbps */ 26906b9e797cSsowmini } 2691e7801d59Ssowmini *val_cnt = 1; 2692da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2693e7801d59Ssowmini return (DLADM_STATUS_OK); 2694e7801d59Ssowmini } 2695e7801d59Ssowmini 2696e7801d59Ssowmini /* ARGSUSED */ 2697e7801d59Ssowmini static dladm_status_t 26984ac67f02SAnurag S. Maskey i_dladm_status_get(dladm_handle_t handle, prop_desc_t *pdp, 26994ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27004ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2701e7801d59Ssowmini { 2702e7801d59Ssowmini link_state_t link_state; 2703e7801d59Ssowmini dladm_status_t status; 2704e7801d59Ssowmini 27054ac67f02SAnurag S. Maskey status = i_dladm_get_state(handle, linkid, &link_state); 27064045d941Ssowmini if (status != DLADM_STATUS_OK) 2707e7801d59Ssowmini return (status); 2708da14cebeSEric Cheng 2709e7801d59Ssowmini switch (link_state) { 2710e7801d59Ssowmini case LINK_STATE_UP: 2711e7801d59Ssowmini (void) strcpy(*prop_val, "up"); 2712e7801d59Ssowmini break; 2713e7801d59Ssowmini case LINK_STATE_DOWN: 2714e7801d59Ssowmini (void) strcpy(*prop_val, "down"); 2715e7801d59Ssowmini break; 2716e7801d59Ssowmini default: 2717e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2718e7801d59Ssowmini break; 2719e7801d59Ssowmini } 2720e7801d59Ssowmini *val_cnt = 1; 27214784fcbdSSowmini Varadhan *perm_flags = MAC_PROP_PERM_READ; 2722e7801d59Ssowmini return (DLADM_STATUS_OK); 2723e7801d59Ssowmini } 2724e7801d59Ssowmini 2725e7801d59Ssowmini /* ARGSUSED */ 2726e7801d59Ssowmini static dladm_status_t 27274ac67f02SAnurag S. Maskey i_dladm_binary_get(dladm_handle_t handle, prop_desc_t *pdp, 27284ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27294ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2730e7801d59Ssowmini { 27313fd94f8cSam223141 dld_ioc_macprop_t *dip; 2732e7801d59Ssowmini dladm_status_t status; 2733e7801d59Ssowmini 27344ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2735da14cebeSEric Cheng &status, perm_flags); 27364045d941Ssowmini if (dip == NULL) 2737e7801d59Ssowmini return (status); 2738da14cebeSEric Cheng 2739e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%x", dip->pr_val[0]); 2740e7801d59Ssowmini free(dip); 2741e7801d59Ssowmini *val_cnt = 1; 2742e7801d59Ssowmini return (DLADM_STATUS_OK); 2743e7801d59Ssowmini } 2744e7801d59Ssowmini 27456b9e797cSsowmini /* ARGSUSED */ 2746e7801d59Ssowmini static dladm_status_t 27474ac67f02SAnurag S. Maskey i_dladm_uint32_get(dladm_handle_t handle, prop_desc_t *pdp, 27484ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 27494ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2750e7801d59Ssowmini { 27513fd94f8cSam223141 dld_ioc_macprop_t *dip; 27524045d941Ssowmini uint32_t v = 0; 2753e7801d59Ssowmini uchar_t *cp; 2754e7801d59Ssowmini dladm_status_t status; 2755e7801d59Ssowmini 27564ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2757da14cebeSEric Cheng &status, perm_flags); 27584045d941Ssowmini if (dip == NULL) 2759e7801d59Ssowmini return (status); 2760da14cebeSEric Cheng 2761e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2762e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 27634045d941Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", v); 2764e7801d59Ssowmini free(dip); 2765e7801d59Ssowmini *val_cnt = 1; 2766e7801d59Ssowmini return (DLADM_STATUS_OK); 2767e7801d59Ssowmini } 2768e7801d59Ssowmini 2769f0f2c3a5SGirish Moodalbail /* 2770f0f2c3a5SGirish Moodalbail * Determines the size of the structure that needs to be sent to drivers 2771f0f2c3a5SGirish Moodalbail * for retrieving the property range values. 2772f0f2c3a5SGirish Moodalbail */ 2773f0f2c3a5SGirish Moodalbail static int 2774f0f2c3a5SGirish Moodalbail i_dladm_range_size(mac_propval_range_t *r, size_t *sz) 2775f0f2c3a5SGirish Moodalbail { 2776f0f2c3a5SGirish Moodalbail uint_t count = r->mpr_count; 2777f0f2c3a5SGirish Moodalbail 2778f0f2c3a5SGirish Moodalbail *sz = sizeof (mac_propval_range_t); 2779f0f2c3a5SGirish Moodalbail --count; 2780f0f2c3a5SGirish Moodalbail 2781f0f2c3a5SGirish Moodalbail switch (r->mpr_type) { 2782f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: 2783f0f2c3a5SGirish Moodalbail *sz += (count * sizeof (mac_propval_uint32_range_t)); 2784f0f2c3a5SGirish Moodalbail return (0); 2785f0f2c3a5SGirish Moodalbail default: 2786f0f2c3a5SGirish Moodalbail break; 2787f0f2c3a5SGirish Moodalbail } 2788f0f2c3a5SGirish Moodalbail *sz = 0; 2789f0f2c3a5SGirish Moodalbail return (EINVAL); 2790f0f2c3a5SGirish Moodalbail } 2791f0f2c3a5SGirish Moodalbail 2792f0f2c3a5SGirish Moodalbail /* ARGSUSED */ 2793f0f2c3a5SGirish Moodalbail static dladm_status_t 2794f0f2c3a5SGirish Moodalbail i_dladm_range_get(dladm_handle_t handle, prop_desc_t *pdp, 2795f0f2c3a5SGirish Moodalbail datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2796f0f2c3a5SGirish Moodalbail datalink_media_t media, uint_t flags, uint_t *perm_flags) 2797f0f2c3a5SGirish Moodalbail { 2798f0f2c3a5SGirish Moodalbail dld_ioc_macprop_t *dip; 2799f0f2c3a5SGirish Moodalbail dladm_status_t status = DLADM_STATUS_OK; 2800f0f2c3a5SGirish Moodalbail size_t sz; 2801f0f2c3a5SGirish Moodalbail mac_propval_range_t *rangep; 2802f0f2c3a5SGirish Moodalbail 2803f0f2c3a5SGirish Moodalbail sz = sizeof (mac_propval_range_t); 2804f0f2c3a5SGirish Moodalbail 2805f0f2c3a5SGirish Moodalbail /* 2806f0f2c3a5SGirish Moodalbail * As caller we don't know number of value ranges, the driver 2807f0f2c3a5SGirish Moodalbail * supports. To begin with we assume that number to be 1. If the 2808f0f2c3a5SGirish Moodalbail * buffer size is insufficient, driver returns back with the 2809f0f2c3a5SGirish Moodalbail * actual count of value ranges. See mac.h for more details. 2810f0f2c3a5SGirish Moodalbail */ 2811f0f2c3a5SGirish Moodalbail retry: 2812f0f2c3a5SGirish Moodalbail if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags, 2813f0f2c3a5SGirish Moodalbail &status)) == NULL) 2814f0f2c3a5SGirish Moodalbail return (status); 2815f0f2c3a5SGirish Moodalbail 2816f0f2c3a5SGirish Moodalbail status = i_dladm_macprop(handle, dip, B_FALSE); 2817f0f2c3a5SGirish Moodalbail if (status != DLADM_STATUS_OK) { 2818f0f2c3a5SGirish Moodalbail if (status == DLADM_STATUS_TOOSMALL) { 2819f0f2c3a5SGirish Moodalbail int err; 2820f0f2c3a5SGirish Moodalbail 2821f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2822f0f2c3a5SGirish Moodalbail if ((err = i_dladm_range_size(rangep, &sz)) == 0) { 2823f0f2c3a5SGirish Moodalbail free(dip); 2824f0f2c3a5SGirish Moodalbail goto retry; 2825f0f2c3a5SGirish Moodalbail } else { 2826f0f2c3a5SGirish Moodalbail status = dladm_errno2status(err); 2827f0f2c3a5SGirish Moodalbail } 2828f0f2c3a5SGirish Moodalbail } 2829f0f2c3a5SGirish Moodalbail free(dip); 2830f0f2c3a5SGirish Moodalbail return (status); 2831f0f2c3a5SGirish Moodalbail } 2832f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2833f0f2c3a5SGirish Moodalbail 2834f0f2c3a5SGirish Moodalbail switch (rangep->mpr_type) { 2835f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: { 2836f0f2c3a5SGirish Moodalbail mac_propval_uint32_range_t *ur; 2837f0f2c3a5SGirish Moodalbail uint_t count = rangep->mpr_count, i; 2838f0f2c3a5SGirish Moodalbail 2839f0f2c3a5SGirish Moodalbail ur = &rangep->range_uint32[0]; 2840f0f2c3a5SGirish Moodalbail 2841f0f2c3a5SGirish Moodalbail for (i = 0; i < count; i++, ur++) { 2842f0f2c3a5SGirish Moodalbail if (ur->mpur_min == ur->mpur_max) { 2843f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2844f0f2c3a5SGirish Moodalbail "%ld", ur->mpur_min); 2845f0f2c3a5SGirish Moodalbail } else { 2846f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 2847f0f2c3a5SGirish Moodalbail "%ld-%ld", ur->mpur_min, ur->mpur_max); 2848f0f2c3a5SGirish Moodalbail } 2849f0f2c3a5SGirish Moodalbail } 2850f0f2c3a5SGirish Moodalbail *val_cnt = count; 2851f0f2c3a5SGirish Moodalbail break; 2852f0f2c3a5SGirish Moodalbail } 2853f0f2c3a5SGirish Moodalbail default: 2854f0f2c3a5SGirish Moodalbail status = DLADM_STATUS_BADARG; 2855f0f2c3a5SGirish Moodalbail break; 2856f0f2c3a5SGirish Moodalbail } 2857f0f2c3a5SGirish Moodalbail free(dip); 2858f0f2c3a5SGirish Moodalbail return (status); 2859f0f2c3a5SGirish Moodalbail } 2860f0f2c3a5SGirish Moodalbail 28616b9e797cSsowmini /* ARGSUSED */ 2862e7801d59Ssowmini static dladm_status_t 2863e75f0919SSebastien Roy i_dladm_tagmode_get(dladm_handle_t handle, prop_desc_t *pdp, 2864e75f0919SSebastien Roy datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2865e75f0919SSebastien Roy datalink_media_t media, uint_t flags, uint_t *perm_flags) 2866e75f0919SSebastien Roy { 2867e75f0919SSebastien Roy dld_ioc_macprop_t *dip; 2868e75f0919SSebastien Roy link_tagmode_t mode; 2869e75f0919SSebastien Roy dladm_status_t status; 2870e75f0919SSebastien Roy 2871e75f0919SSebastien Roy dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2872e75f0919SSebastien Roy &status, perm_flags); 2873e75f0919SSebastien Roy if (dip == NULL) 2874e75f0919SSebastien Roy return (status); 2875e75f0919SSebastien Roy (void) memcpy(&mode, dip->pr_val, sizeof (mode)); 2876e75f0919SSebastien Roy free(dip); 2877e75f0919SSebastien Roy 2878e75f0919SSebastien Roy switch (mode) { 2879e75f0919SSebastien Roy case LINK_TAGMODE_NORMAL: 2880e75f0919SSebastien Roy (void) strlcpy(*prop_val, "normal", DLADM_PROP_VAL_MAX); 2881e75f0919SSebastien Roy break; 2882e75f0919SSebastien Roy case LINK_TAGMODE_VLANONLY: 2883e75f0919SSebastien Roy (void) strlcpy(*prop_val, "vlanonly", DLADM_PROP_VAL_MAX); 2884e75f0919SSebastien Roy break; 2885e75f0919SSebastien Roy default: 2886e75f0919SSebastien Roy (void) strlcpy(*prop_val, "unknown", DLADM_PROP_VAL_MAX); 2887e75f0919SSebastien Roy } 2888e75f0919SSebastien Roy *val_cnt = 1; 2889e75f0919SSebastien Roy return (DLADM_STATUS_OK); 2890e75f0919SSebastien Roy } 2891e75f0919SSebastien Roy 2892e75f0919SSebastien Roy /* ARGSUSED */ 2893e75f0919SSebastien Roy static dladm_status_t 28944ac67f02SAnurag S. Maskey i_dladm_flowctl_get(dladm_handle_t handle, prop_desc_t *pdp, 28954ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 28964ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2897e7801d59Ssowmini { 28983fd94f8cSam223141 dld_ioc_macprop_t *dip; 2899e7801d59Ssowmini link_flowctrl_t v; 2900e7801d59Ssowmini dladm_status_t status; 2901e7801d59Ssowmini uchar_t *cp; 2902e7801d59Ssowmini 29034ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2904da14cebeSEric Cheng &status, perm_flags); 29054045d941Ssowmini if (dip == NULL) 2906e7801d59Ssowmini return (status); 2907da14cebeSEric Cheng 2908e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2909e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 2910e7801d59Ssowmini switch (v) { 2911e7801d59Ssowmini case LINK_FLOWCTRL_NONE: 2912e7801d59Ssowmini (void) sprintf(*prop_val, "no"); 2913e7801d59Ssowmini break; 2914e7801d59Ssowmini case LINK_FLOWCTRL_RX: 2915e7801d59Ssowmini (void) sprintf(*prop_val, "rx"); 2916e7801d59Ssowmini break; 2917e7801d59Ssowmini case LINK_FLOWCTRL_TX: 2918e7801d59Ssowmini (void) sprintf(*prop_val, "tx"); 2919e7801d59Ssowmini break; 2920e7801d59Ssowmini case LINK_FLOWCTRL_BI: 2921e7801d59Ssowmini (void) sprintf(*prop_val, "bi"); 2922e7801d59Ssowmini break; 2923e7801d59Ssowmini } 2924e7801d59Ssowmini free(dip); 2925e7801d59Ssowmini *val_cnt = 1; 2926e7801d59Ssowmini return (DLADM_STATUS_OK); 2927e7801d59Ssowmini } 2928e7801d59Ssowmini 2929e7801d59Ssowmini 2930e7801d59Ssowmini /* ARGSUSED */ 2931e7801d59Ssowmini static dladm_status_t 29323361618bSRishi Srivatsavai i_dladm_set_private_prop(dladm_handle_t handle, datalink_id_t linkid, 29334ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 29344ac67f02SAnurag S. Maskey 2935e7801d59Ssowmini { 2936bcb5c89dSSowmini Varadhan int i, slen; 2937eae72b5bSSebastien Roy int bufsize = 0; 29383fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 2939e7801d59Ssowmini uchar_t *dp; 2940bcb5c89dSSowmini Varadhan link_attr_t *p; 29414045d941Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2942e7801d59Ssowmini 2943e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 2944e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 2945e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2946e7801d59Ssowmini p = dladm_name2prop(prop_name); 29473fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 2948e7801d59Ssowmini return (DLADM_STATUS_BADARG); 2949e7801d59Ssowmini 29503361618bSRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE)) 29513361618bSRishi Srivatsavai return (DLADM_STATUS_OK); 29523361618bSRishi Srivatsavai 2953e7801d59Ssowmini /* 2954e7801d59Ssowmini * private properties: all parsing is done in the kernel. 2955e7801d59Ssowmini * allocate a enough space for each property + its separator (','). 2956e7801d59Ssowmini */ 2957e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2958e7801d59Ssowmini bufsize += strlen(prop_val[i]) + 1; 2959e7801d59Ssowmini } 29604045d941Ssowmini 29614045d941Ssowmini if (prop_val == NULL) { 29624045d941Ssowmini /* 29634045d941Ssowmini * getting default value. so use more buffer space. 29644045d941Ssowmini */ 2965bcb5c89dSSowmini Varadhan bufsize += DLADM_PROP_BUF_CHUNK; 29664045d941Ssowmini } 29674045d941Ssowmini 2968bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(bufsize + 1, linkid, prop_name, 29693fd94f8cSam223141 (prop_val != NULL ? 0 : MAC_PROP_DEFAULT), &status); 2970e7801d59Ssowmini if (dip == NULL) 2971e7801d59Ssowmini return (status); 2972e7801d59Ssowmini 2973e7801d59Ssowmini dp = (uchar_t *)dip->pr_val; 2974e7801d59Ssowmini slen = 0; 2975bcb5c89dSSowmini Varadhan 29764045d941Ssowmini if (prop_val == NULL) { 29774ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_FALSE); 297862ee1d25SArtem Kachitchkine dip->pr_flags = 0; 29794045d941Ssowmini } else { 2980e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 2981e7801d59Ssowmini int plen = 0; 2982e7801d59Ssowmini 2983e7801d59Ssowmini plen = strlen(prop_val[i]); 2984e7801d59Ssowmini bcopy(prop_val[i], dp, plen); 2985e7801d59Ssowmini slen += plen; 2986e7801d59Ssowmini /* 2987e7801d59Ssowmini * add a "," separator and update dp. 2988e7801d59Ssowmini */ 2989e7801d59Ssowmini if (i != (val_cnt -1)) 2990e7801d59Ssowmini dp[slen++] = ','; 2991e7801d59Ssowmini dp += (plen + 1); 2992e7801d59Ssowmini } 2993e7801d59Ssowmini } 299462ee1d25SArtem Kachitchkine if (status == DLADM_STATUS_OK) 299562ee1d25SArtem Kachitchkine status = i_dladm_macprop(handle, dip, B_TRUE); 29964045d941Ssowmini 2997e7801d59Ssowmini free(dip); 2998e7801d59Ssowmini return (status); 2999e7801d59Ssowmini } 3000e7801d59Ssowmini 3001e7801d59Ssowmini static dladm_status_t 300262ee1d25SArtem Kachitchkine i_dladm_get_priv_prop(dladm_handle_t handle, datalink_id_t linkid, 30034ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cnt, 30044ac67f02SAnurag S. Maskey dladm_prop_type_t type, uint_t dld_flags) 3005e7801d59Ssowmini { 3006e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 30073fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 3008bcb5c89dSSowmini Varadhan link_attr_t *p; 3009e7801d59Ssowmini 3010e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 3011e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 3012e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3013e7801d59Ssowmini 3014e7801d59Ssowmini p = dladm_name2prop(prop_name); 30153fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 3016e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3017e7801d59Ssowmini 3018e7801d59Ssowmini /* 3019e7801d59Ssowmini * private properties: all parsing is done in the kernel. 3020e7801d59Ssowmini */ 3021bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(DLADM_PROP_BUF_CHUNK, linkid, prop_name, 3022bcb5c89dSSowmini Varadhan dld_flags, &status); 3023e7801d59Ssowmini if (dip == NULL) 3024e7801d59Ssowmini return (status); 3025e7801d59Ssowmini 30264ac67f02SAnurag S. Maskey if ((status = i_dladm_macprop(handle, dip, B_FALSE)) == 30274ac67f02SAnurag S. Maskey DLADM_STATUS_OK) { 3028afdda45fSVasumathi Sundaram - Sun Microsystems if (type == DLADM_PROP_VAL_PERM) { 3029da14cebeSEric Cheng (void) dladm_perm2str(dip->pr_perm_flags, *prop_val); 303062ee1d25SArtem Kachitchkine } else if (type == DLADM_PROP_VAL_MODIFIABLE) { 303162ee1d25SArtem Kachitchkine *prop_val[0] = '\0'; 3032afdda45fSVasumathi Sundaram - Sun Microsystems } else { 3033afdda45fSVasumathi Sundaram - Sun Microsystems (void) strncpy(*prop_val, dip->pr_val, 3034afdda45fSVasumathi Sundaram - Sun Microsystems DLADM_PROP_VAL_MAX); 3035afdda45fSVasumathi Sundaram - Sun Microsystems } 3036e7801d59Ssowmini *val_cnt = 1; 303762ee1d25SArtem Kachitchkine } else if ((status == DLADM_STATUS_NOTSUP) && 303862ee1d25SArtem Kachitchkine (type == DLADM_PROP_VAL_CURRENT)) { 303962ee1d25SArtem Kachitchkine status = DLADM_STATUS_NOTFOUND; 3040e7801d59Ssowmini } 30414045d941Ssowmini free(dip); 30424045d941Ssowmini return (status); 30434045d941Ssowmini } 30444045d941Ssowmini 30454045d941Ssowmini 30464045d941Ssowmini static dladm_status_t 30474ac67f02SAnurag S. Maskey i_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp, 30484ac67f02SAnurag S. Maskey datalink_id_t linkid, datalink_media_t media, uint_t flags) 30494045d941Ssowmini { 30504045d941Ssowmini dladm_status_t status; 30514045d941Ssowmini char **prop_vals = NULL, *buf; 30524045d941Ssowmini size_t bufsize; 30534045d941Ssowmini uint_t cnt; 30544045d941Ssowmini int i; 3055afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 30564045d941Ssowmini 30574045d941Ssowmini /* 30584045d941Ssowmini * Allocate buffer needed for prop_vals array. We can have at most 30594045d941Ssowmini * DLADM_MAX_PROP_VALCNT char *prop_vals[] entries, where 30604045d941Ssowmini * each entry has max size DLADM_PROP_VAL_MAX 30614045d941Ssowmini */ 30624045d941Ssowmini bufsize = 30634045d941Ssowmini (sizeof (char *) + DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT; 30644045d941Ssowmini buf = malloc(bufsize); 30654045d941Ssowmini prop_vals = (char **)(void *)buf; 30664045d941Ssowmini for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) { 30674045d941Ssowmini prop_vals[i] = buf + 30684045d941Ssowmini sizeof (char *) * DLADM_MAX_PROP_VALCNT + 30694045d941Ssowmini i * DLADM_PROP_VAL_MAX; 30704045d941Ssowmini } 307113a55820Sar224390 307213a55820Sar224390 /* 30733bc21d0aSAruna Ramakrishna - Sun Microsystems * For properties which have pdp->pd_defval.vd_name as a non-empty 30743bc21d0aSAruna Ramakrishna - Sun Microsystems * string, the "" itself is used to reset the property (exceptions 30753bc21d0aSAruna Ramakrishna - Sun Microsystems * are zone and autopush, which populate vdp->vd_val). So 30763bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm can copy pdp->pd_defval over to the val_desc_t passed 30773bc21d0aSAruna Ramakrishna - Sun Microsystems * down on the setprop using the global values in the table. For 30783bc21d0aSAruna Ramakrishna - Sun Microsystems * other cases (vd_name is ""), doing reset-linkprop will cause 30793bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm to do a getprop to find the default value and then do 30803bc21d0aSAruna Ramakrishna - Sun Microsystems * a setprop to reset the value to default. 308113a55820Sar224390 */ 30824ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media, 3083afdda45fSVasumathi Sundaram - Sun Microsystems MAC_PROP_DEFAULT, &perm_flags); 30844045d941Ssowmini if (status == DLADM_STATUS_OK) { 3085afdda45fSVasumathi Sundaram - Sun Microsystems if (perm_flags == MAC_PROP_PERM_RW) { 30864ac67f02SAnurag S. Maskey status = i_dladm_set_single_prop(handle, linkid, 30874ac67f02SAnurag S. Maskey pdp->pd_class, media, pdp, prop_vals, cnt, flags); 30884045d941Ssowmini } 3089afdda45fSVasumathi Sundaram - Sun Microsystems else 3090afdda45fSVasumathi Sundaram - Sun Microsystems status = DLADM_STATUS_NOTSUP; 3091afdda45fSVasumathi Sundaram - Sun Microsystems } 30924045d941Ssowmini free(buf); 3093e7801d59Ssowmini return (status); 3094e7801d59Ssowmini } 3095bcb5c89dSSowmini Varadhan 30964eaa4710SRishi Srivatsavai /* ARGSUSED */ 30974eaa4710SRishi Srivatsavai static dladm_status_t 30984eaa4710SRishi Srivatsavai get_stp_prop(dladm_handle_t handle, struct prop_desc *pd, datalink_id_t linkid, 30994eaa4710SRishi Srivatsavai char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, 31004eaa4710SRishi Srivatsavai uint_t *perm_flags) 31014eaa4710SRishi Srivatsavai { 31024eaa4710SRishi Srivatsavai const bridge_public_prop_t *bpp; 31034eaa4710SRishi Srivatsavai dladm_status_t retv; 31044eaa4710SRishi Srivatsavai int val, i; 31054eaa4710SRishi Srivatsavai 31064eaa4710SRishi Srivatsavai if (flags != 0) 31074eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 31084eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 31094eaa4710SRishi Srivatsavai *val_cnt = 1; 31104eaa4710SRishi Srivatsavai for (bpp = bridge_prop; bpp->bpp_name != NULL; bpp++) 31114eaa4710SRishi Srivatsavai if (strcmp(bpp->bpp_name, pd->pd_name) == 0) 31124eaa4710SRishi Srivatsavai break; 31134eaa4710SRishi Srivatsavai retv = dladm_bridge_get_port_cfg(handle, linkid, bpp->bpp_code, &val); 31144eaa4710SRishi Srivatsavai /* If the daemon isn't running, then return the persistent value */ 31154eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 31164eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 31174eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 31184eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 31194eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 31204eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 31214eaa4710SRishi Srivatsavai } 31224eaa4710SRishi Srivatsavai if (retv != DLADM_STATUS_OK) { 31234eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 31244eaa4710SRishi Srivatsavai return (retv); 31254eaa4710SRishi Srivatsavai } 31264eaa4710SRishi Srivatsavai if (val == pd->pd_defval.vd_val && pd->pd_defval.vd_name[0] != '\0') { 31274eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 31284eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 31294eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 31304eaa4710SRishi Srivatsavai } 31314eaa4710SRishi Srivatsavai for (i = 0; i < pd->pd_noptval; i++) { 31324eaa4710SRishi Srivatsavai if (val == pd->pd_optval[i].vd_val) { 31334eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_optval[i].vd_name, 31344eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 31354eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 31364eaa4710SRishi Srivatsavai } 31374eaa4710SRishi Srivatsavai } 31384eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", (unsigned)val); 31394eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 31404eaa4710SRishi Srivatsavai } 31414eaa4710SRishi Srivatsavai 31424eaa4710SRishi Srivatsavai /* ARGSUSED1 */ 31434eaa4710SRishi Srivatsavai static dladm_status_t 31444eaa4710SRishi Srivatsavai set_stp_prop(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 31454eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 31464eaa4710SRishi Srivatsavai { 31474eaa4710SRishi Srivatsavai /* 31484eaa4710SRishi Srivatsavai * Special case for mcheck: the daemon resets the value to zero, and we 31494eaa4710SRishi Srivatsavai * don't want the daemon to refresh itself; it leads to deadlock. 31504eaa4710SRishi Srivatsavai */ 31514eaa4710SRishi Srivatsavai if (flags & DLADM_OPT_NOREFRESH) 31524eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 31534eaa4710SRishi Srivatsavai 31544eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 31554eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 31564eaa4710SRishi Srivatsavai } 31574eaa4710SRishi Srivatsavai 31584eaa4710SRishi Srivatsavai /* 31594eaa4710SRishi Srivatsavai * This is used only for stp_priority, stp_cost, and stp_mcheck. 31604eaa4710SRishi Srivatsavai */ 31614eaa4710SRishi Srivatsavai /* ARGSUSED */ 31624eaa4710SRishi Srivatsavai static dladm_status_t 31634eaa4710SRishi Srivatsavai check_stp_prop(dladm_handle_t handle, struct prop_desc *pd, 31644eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 31654eaa4710SRishi Srivatsavai datalink_media_t media) 31664eaa4710SRishi Srivatsavai { 31674eaa4710SRishi Srivatsavai char *cp; 31684eaa4710SRishi Srivatsavai boolean_t iscost; 31694eaa4710SRishi Srivatsavai 31704eaa4710SRishi Srivatsavai if (val_cnt != 1) 31714eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 31724eaa4710SRishi Srivatsavai 31734eaa4710SRishi Srivatsavai if (prop_val == NULL) { 31744eaa4710SRishi Srivatsavai vdp->vd_val = 0; 31754eaa4710SRishi Srivatsavai } else { 31764eaa4710SRishi Srivatsavai /* Only stp_priority and stp_cost use this function */ 31774eaa4710SRishi Srivatsavai iscost = strcmp(pd->pd_name, "stp_cost") == 0; 31784eaa4710SRishi Srivatsavai 31794eaa4710SRishi Srivatsavai if (iscost && strcmp(prop_val[0], "auto") == 0) { 31804eaa4710SRishi Srivatsavai /* Illegal value 0 is allowed to mean "automatic" */ 31814eaa4710SRishi Srivatsavai vdp->vd_val = 0; 31824eaa4710SRishi Srivatsavai } else { 31834eaa4710SRishi Srivatsavai errno = 0; 31844eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 31854eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 31864eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 31874eaa4710SRishi Srivatsavai } 31884eaa4710SRishi Srivatsavai } 31894eaa4710SRishi Srivatsavai 31904eaa4710SRishi Srivatsavai if (iscost) { 31914eaa4710SRishi Srivatsavai return (vdp->vd_val > 65535 ? DLADM_STATUS_BADVAL : 31924eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 31934eaa4710SRishi Srivatsavai } else { 31944eaa4710SRishi Srivatsavai if (vdp->vd_val > 255) 31954eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 31964eaa4710SRishi Srivatsavai /* 31974eaa4710SRishi Srivatsavai * If the user is setting stp_mcheck non-zero, then (per the 31984eaa4710SRishi Srivatsavai * IEEE management standards and UNH testing) we need to check 31994eaa4710SRishi Srivatsavai * whether this link is part of a bridge that is running RSTP. 32004eaa4710SRishi Srivatsavai * If it's not, then setting the flag is an error. Note that 32014eaa4710SRishi Srivatsavai * errors are intentionally discarded here; it's the value 32024eaa4710SRishi Srivatsavai * that's the problem -- it's not a bad value, merely one that 32034eaa4710SRishi Srivatsavai * can't be used now. 32044eaa4710SRishi Srivatsavai */ 32054eaa4710SRishi Srivatsavai if (strcmp(pd->pd_name, "stp_mcheck") == 0 && 32064eaa4710SRishi Srivatsavai vdp->vd_val != 0) { 32074eaa4710SRishi Srivatsavai char bridge[MAXLINKNAMELEN]; 32084eaa4710SRishi Srivatsavai UID_STP_CFG_T cfg; 32094eaa4710SRishi Srivatsavai dladm_bridge_prot_t brprot; 32104eaa4710SRishi Srivatsavai 32114eaa4710SRishi Srivatsavai if (dladm_bridge_getlink(handle, linkid, bridge, 32124eaa4710SRishi Srivatsavai sizeof (bridge)) != DLADM_STATUS_OK || 32134eaa4710SRishi Srivatsavai dladm_bridge_get_properties(bridge, &cfg, 32144eaa4710SRishi Srivatsavai &brprot) != DLADM_STATUS_OK) 32154eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 32164eaa4710SRishi Srivatsavai if (cfg.force_version <= 1) 32174eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 32184eaa4710SRishi Srivatsavai } 32194eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 32204eaa4710SRishi Srivatsavai } 32214eaa4710SRishi Srivatsavai } 32224eaa4710SRishi Srivatsavai 32234eaa4710SRishi Srivatsavai /* ARGSUSED */ 32244eaa4710SRishi Srivatsavai static dladm_status_t 32254eaa4710SRishi Srivatsavai get_bridge_forward(dladm_handle_t handle, struct prop_desc *pd, 32264eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 32274eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 32284eaa4710SRishi Srivatsavai { 32294eaa4710SRishi Srivatsavai dladm_status_t retv; 32304eaa4710SRishi Srivatsavai uint_t val; 32314eaa4710SRishi Srivatsavai 32324eaa4710SRishi Srivatsavai if (flags != 0) 32334eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 32344eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 32354eaa4710SRishi Srivatsavai *val_cnt = 1; 32364eaa4710SRishi Srivatsavai retv = dladm_bridge_get_forwarding(handle, linkid, &val); 32374eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 32384eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 32394eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 32404eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 32414eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 32424eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 32434eaa4710SRishi Srivatsavai } 32444eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_OK) 32454eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", val); 32464eaa4710SRishi Srivatsavai else 32474eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 32484eaa4710SRishi Srivatsavai return (retv); 32494eaa4710SRishi Srivatsavai } 32504eaa4710SRishi Srivatsavai 32514eaa4710SRishi Srivatsavai /* ARGSUSED */ 32524eaa4710SRishi Srivatsavai static dladm_status_t 32534eaa4710SRishi Srivatsavai set_bridge_forward(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 32544eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 32554eaa4710SRishi Srivatsavai { 32564eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 32574eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 32584eaa4710SRishi Srivatsavai } 32594eaa4710SRishi Srivatsavai 32604eaa4710SRishi Srivatsavai /* ARGSUSED */ 32614eaa4710SRishi Srivatsavai static dladm_status_t 32624eaa4710SRishi Srivatsavai get_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 32634eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 32644eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 32654eaa4710SRishi Srivatsavai { 32664eaa4710SRishi Srivatsavai dladm_status_t status; 32674eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 32684eaa4710SRishi Srivatsavai uint16_t pvid; 32694eaa4710SRishi Srivatsavai 32704eaa4710SRishi Srivatsavai if (flags != 0) 32714eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 32724eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 32734eaa4710SRishi Srivatsavai *val_cnt = 1; 32744eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 32754eaa4710SRishi Srivatsavai 0, &status); 32764eaa4710SRishi Srivatsavai if (dip == NULL) 32774eaa4710SRishi Srivatsavai return (status); 32784eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_FALSE); 32794eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 32804eaa4710SRishi Srivatsavai (void) memcpy(&pvid, dip->pr_val, sizeof (pvid)); 32814eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", pvid); 32824eaa4710SRishi Srivatsavai } else { 32834eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 32844eaa4710SRishi Srivatsavai } 32854eaa4710SRishi Srivatsavai free(dip); 32864eaa4710SRishi Srivatsavai return (status); 32874eaa4710SRishi Srivatsavai } 32884eaa4710SRishi Srivatsavai 32894eaa4710SRishi Srivatsavai /* ARGSUSED */ 32904eaa4710SRishi Srivatsavai static dladm_status_t 32914eaa4710SRishi Srivatsavai set_bridge_pvid(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 32924eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 32934eaa4710SRishi Srivatsavai { 32944eaa4710SRishi Srivatsavai dladm_status_t status; 32954eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 32964eaa4710SRishi Srivatsavai uint16_t pvid; 32974eaa4710SRishi Srivatsavai 32984eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 32994eaa4710SRishi Srivatsavai 0, &status); 33004eaa4710SRishi Srivatsavai if (dip == NULL) 33014eaa4710SRishi Srivatsavai return (status); 33024eaa4710SRishi Srivatsavai pvid = vdp->vd_val; 33034eaa4710SRishi Srivatsavai (void) memcpy(dip->pr_val, &pvid, sizeof (pvid)); 33044eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_TRUE); 33054eaa4710SRishi Srivatsavai free(dip); 33064eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 33074eaa4710SRishi Srivatsavai return (status); 33084eaa4710SRishi Srivatsavai 33094eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 33104eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 33114eaa4710SRishi Srivatsavai } 33124eaa4710SRishi Srivatsavai 33134eaa4710SRishi Srivatsavai /* ARGSUSED */ 33144eaa4710SRishi Srivatsavai static dladm_status_t 33154eaa4710SRishi Srivatsavai check_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 33164eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 33174eaa4710SRishi Srivatsavai datalink_media_t media) 33184eaa4710SRishi Srivatsavai { 33194eaa4710SRishi Srivatsavai char *cp; 33204eaa4710SRishi Srivatsavai 33214eaa4710SRishi Srivatsavai if (val_cnt != 1) 33224eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 33234eaa4710SRishi Srivatsavai 33244eaa4710SRishi Srivatsavai if (prop_val == NULL) { 33254eaa4710SRishi Srivatsavai vdp->vd_val = 1; 33264eaa4710SRishi Srivatsavai } else { 33274eaa4710SRishi Srivatsavai errno = 0; 33284eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 33294eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 33304eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 33314eaa4710SRishi Srivatsavai } 33324eaa4710SRishi Srivatsavai 33334eaa4710SRishi Srivatsavai return (vdp->vd_val > VLAN_ID_MAX ? DLADM_STATUS_BADVAL : 33344eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 33354eaa4710SRishi Srivatsavai } 33364eaa4710SRishi Srivatsavai 3337bcb5c89dSSowmini Varadhan dladm_status_t 33384ac67f02SAnurag S. Maskey i_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf, 33394ac67f02SAnurag S. Maskey mac_prop_id_t cmd, size_t len, boolean_t set) 3340bcb5c89dSSowmini Varadhan { 3341bcb5c89dSSowmini Varadhan uint32_t flags; 3342bcb5c89dSSowmini Varadhan dladm_status_t status; 3343bcb5c89dSSowmini Varadhan uint32_t media; 3344bcb5c89dSSowmini Varadhan dld_ioc_macprop_t *dip; 3345bcb5c89dSSowmini Varadhan void *dp; 3346bcb5c89dSSowmini Varadhan 33474ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, 33484ac67f02SAnurag S. Maskey &media, NULL, 0)) != DLADM_STATUS_OK) { 3349bcb5c89dSSowmini Varadhan return (status); 3350bcb5c89dSSowmini Varadhan } 3351bcb5c89dSSowmini Varadhan 3352bcb5c89dSSowmini Varadhan if (media != DL_WIFI) 3353bcb5c89dSSowmini Varadhan return (DLADM_STATUS_BADARG); 3354bcb5c89dSSowmini Varadhan 3355bcb5c89dSSowmini Varadhan if (!(flags & DLADM_OPT_ACTIVE)) 3356bcb5c89dSSowmini Varadhan return (DLADM_STATUS_TEMPONLY); 3357bcb5c89dSSowmini Varadhan 3358bcb5c89dSSowmini Varadhan if (len == (MAX_BUF_LEN - WIFI_BUF_OFFSET)) 3359bcb5c89dSSowmini Varadhan len = MAX_BUF_LEN - sizeof (dld_ioc_macprop_t) - 1; 3360bcb5c89dSSowmini Varadhan 3361bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_id(len, linkid, cmd, 0, &status); 3362bcb5c89dSSowmini Varadhan if (dip == NULL) 3363bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 3364bcb5c89dSSowmini Varadhan 3365bcb5c89dSSowmini Varadhan dp = (uchar_t *)dip->pr_val; 3366bcb5c89dSSowmini Varadhan if (set) 3367bcb5c89dSSowmini Varadhan (void) memcpy(dp, buf, len); 3368bcb5c89dSSowmini Varadhan 33694ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, set); 33700b8f0546SSowmini Varadhan if (status == DLADM_STATUS_OK) { 3371bcb5c89dSSowmini Varadhan if (!set) 3372bcb5c89dSSowmini Varadhan (void) memcpy(buf, dp, len); 3373bcb5c89dSSowmini Varadhan } 3374bcb5c89dSSowmini Varadhan 3375bcb5c89dSSowmini Varadhan free(dip); 3376bcb5c89dSSowmini Varadhan return (status); 3377bcb5c89dSSowmini Varadhan } 3378bcb5c89dSSowmini Varadhan 3379da14cebeSEric Cheng dladm_status_t 3380da14cebeSEric Cheng dladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues) 3381da14cebeSEric Cheng { 338262ee1d25SArtem Kachitchkine return (dladm_parse_args(str, listp, novalues)); 3383da14cebeSEric Cheng } 3384da14cebeSEric Cheng 3385da14cebeSEric Cheng /* 3386da14cebeSEric Cheng * Retrieve the one link property from the database 3387da14cebeSEric Cheng */ 3388da14cebeSEric Cheng /*ARGSUSED*/ 3389da14cebeSEric Cheng static int 33904ac67f02SAnurag S. Maskey i_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid, 33914ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 3392da14cebeSEric Cheng { 3393da14cebeSEric Cheng dladm_arg_list_t *proplist = arg; 3394da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3395da14cebeSEric Cheng 3396da14cebeSEric Cheng aip = &proplist->al_info[proplist->al_count]; 3397da14cebeSEric Cheng /* 3398da14cebeSEric Cheng * it is fine to point to prop_name since prop_name points to the 3399da14cebeSEric Cheng * prop_table[n].pd_name. 3400da14cebeSEric Cheng */ 3401da14cebeSEric Cheng aip->ai_name = prop_name; 3402da14cebeSEric Cheng 34034ac67f02SAnurag S. Maskey (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 34044ac67f02SAnurag S. Maskey prop_name, aip->ai_val, &aip->ai_count); 3405da14cebeSEric Cheng 3406da14cebeSEric Cheng if (aip->ai_count != 0) 3407da14cebeSEric Cheng proplist->al_count++; 3408da14cebeSEric Cheng 3409da14cebeSEric Cheng return (DLADM_WALK_CONTINUE); 3410da14cebeSEric Cheng } 3411da14cebeSEric Cheng 3412da14cebeSEric Cheng 3413da14cebeSEric Cheng /* 3414da14cebeSEric Cheng * Retrieve all link properties for a link from the database and 3415da14cebeSEric Cheng * return a property list. 3416da14cebeSEric Cheng */ 3417da14cebeSEric Cheng dladm_status_t 34184ac67f02SAnurag S. Maskey dladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid, 34194ac67f02SAnurag S. Maskey dladm_arg_list_t **listp) 3420da14cebeSEric Cheng { 3421da14cebeSEric Cheng dladm_arg_list_t *list; 3422da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3423da14cebeSEric Cheng 3424da14cebeSEric Cheng list = calloc(1, sizeof (dladm_arg_list_t)); 3425da14cebeSEric Cheng if (list == NULL) 3426da14cebeSEric Cheng return (dladm_errno2status(errno)); 3427da14cebeSEric Cheng 34284ac67f02SAnurag S. Maskey status = dladm_walk_linkprop(handle, linkid, list, 34294ac67f02SAnurag S. Maskey i_dladm_get_one_prop); 3430da14cebeSEric Cheng 3431da14cebeSEric Cheng *listp = list; 3432da14cebeSEric Cheng return (status); 3433da14cebeSEric Cheng } 3434da14cebeSEric Cheng 3435da14cebeSEric Cheng /* 3436da14cebeSEric Cheng * Retrieve the named property from a proplist, check the value and 3437da14cebeSEric Cheng * convert to a kernel structure. 3438da14cebeSEric Cheng */ 3439da14cebeSEric Cheng static dladm_status_t 34404ac67f02SAnurag S. Maskey i_dladm_link_proplist_extract_one(dladm_handle_t handle, 34414ac67f02SAnurag S. Maskey dladm_arg_list_t *proplist, const char *name, void *val) 3442da14cebeSEric Cheng { 3443da14cebeSEric Cheng dladm_status_t status; 3444da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3445da14cebeSEric Cheng int i, j; 3446da14cebeSEric Cheng 3447da14cebeSEric Cheng /* Find named property in proplist */ 3448da14cebeSEric Cheng for (i = 0; i < proplist->al_count; i++) { 3449da14cebeSEric Cheng aip = &proplist->al_info[i]; 3450da14cebeSEric Cheng if (strcasecmp(aip->ai_name, name) == 0) 3451da14cebeSEric Cheng break; 3452da14cebeSEric Cheng } 3453da14cebeSEric Cheng 3454da14cebeSEric Cheng /* Property not in list */ 3455da14cebeSEric Cheng if (i == proplist->al_count) 3456da14cebeSEric Cheng return (DLADM_STATUS_OK); 3457da14cebeSEric Cheng 3458da14cebeSEric Cheng for (i = 0; i < DLADM_MAX_PROPS; i++) { 3459da14cebeSEric Cheng prop_desc_t *pdp = &prop_table[i]; 3460da14cebeSEric Cheng val_desc_t *vdp; 3461da14cebeSEric Cheng 3462da14cebeSEric Cheng vdp = malloc(sizeof (val_desc_t) * aip->ai_count); 3463da14cebeSEric Cheng if (vdp == NULL) 3464da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 3465da14cebeSEric Cheng 3466da14cebeSEric Cheng if (strcasecmp(aip->ai_name, pdp->pd_name) != 0) 3467da14cebeSEric Cheng continue; 3468da14cebeSEric Cheng 3469da14cebeSEric Cheng if (aip->ai_val == NULL) 3470da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 3471da14cebeSEric Cheng 3472da14cebeSEric Cheng /* Check property value */ 3473da14cebeSEric Cheng if (pdp->pd_check != NULL) { 34744ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, 0, aip->ai_val, 3475da14cebeSEric Cheng aip->ai_count, vdp, 0); 3476da14cebeSEric Cheng } else { 3477da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3478da14cebeSEric Cheng } 3479da14cebeSEric Cheng 3480da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3481da14cebeSEric Cheng return (status); 3482da14cebeSEric Cheng 3483da14cebeSEric Cheng for (j = 0; j < DLADM_MAX_RSRC_PROP; j++) { 3484da14cebeSEric Cheng resource_prop_t *rpp = &rsrc_prop_table[j]; 3485da14cebeSEric Cheng 3486da14cebeSEric Cheng if (strcasecmp(aip->ai_name, rpp->rp_name) != 0) 3487da14cebeSEric Cheng continue; 3488da14cebeSEric Cheng 3489da14cebeSEric Cheng /* Extract kernel structure */ 3490da14cebeSEric Cheng if (rpp->rp_extract != NULL) { 3491da14cebeSEric Cheng status = rpp->rp_extract(vdp, val, 3492da14cebeSEric Cheng aip->ai_count); 3493da14cebeSEric Cheng } else { 3494da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3495da14cebeSEric Cheng } 3496da14cebeSEric Cheng break; 3497da14cebeSEric Cheng } 3498da14cebeSEric Cheng 3499da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3500da14cebeSEric Cheng return (status); 3501da14cebeSEric Cheng 3502da14cebeSEric Cheng break; 3503da14cebeSEric Cheng } 3504da14cebeSEric Cheng return (status); 3505da14cebeSEric Cheng } 3506da14cebeSEric Cheng 3507da14cebeSEric Cheng /* 3508da14cebeSEric Cheng * Extract properties from a proplist and convert to mac_resource_props_t. 3509da14cebeSEric Cheng */ 3510da14cebeSEric Cheng dladm_status_t 35114ac67f02SAnurag S. Maskey dladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist, 3512da14cebeSEric Cheng mac_resource_props_t *mrp) 3513da14cebeSEric Cheng { 3514da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3515da14cebeSEric Cheng 35164ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "maxbw", 35174ac67f02SAnurag S. Maskey mrp); 3518da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3519da14cebeSEric Cheng return (status); 35204ac67f02SAnurag S. Maskey status = i_dladm_link_proplist_extract_one(handle, proplist, "priority", 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, "cpus", 35254ac67f02SAnurag S. Maskey mrp); 3526da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3527da14cebeSEric Cheng return (status); 3528da14cebeSEric Cheng return (status); 3529da14cebeSEric Cheng } 3530da14cebeSEric Cheng 3531da14cebeSEric Cheng static const char * 3532da14cebeSEric Cheng dladm_perm2str(uint_t perm, char *buf) 3533da14cebeSEric Cheng { 3534da14cebeSEric Cheng (void) snprintf(buf, DLADM_STRSIZE, "%c%c", 3535da14cebeSEric Cheng ((perm & MAC_PROP_PERM_READ) != 0) ? 'r' : '-', 3536da14cebeSEric Cheng ((perm & MAC_PROP_PERM_WRITE) != 0) ? 'w' : '-'); 3537da14cebeSEric Cheng return (buf); 3538da14cebeSEric Cheng } 35394784fcbdSSowmini Varadhan 35404784fcbdSSowmini Varadhan dladm_status_t 35414ac67f02SAnurag S. Maskey i_dladm_get_state(dladm_handle_t handle, datalink_id_t linkid, 35424ac67f02SAnurag S. Maskey link_state_t *state) 35434784fcbdSSowmini Varadhan { 35444784fcbdSSowmini Varadhan dld_ioc_macprop_t *dip; 35454784fcbdSSowmini Varadhan dladm_status_t status; 35464784fcbdSSowmini Varadhan uint_t perms; 35474784fcbdSSowmini Varadhan 35484ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, "state", 0, &status, 35494ac67f02SAnurag S. Maskey &perms); 35504784fcbdSSowmini Varadhan if (status != DLADM_STATUS_OK) 35514784fcbdSSowmini Varadhan return (status); 35524784fcbdSSowmini Varadhan (void) memcpy(state, dip->pr_val, sizeof (*state)); 35534784fcbdSSowmini Varadhan free(dip); 35544784fcbdSSowmini Varadhan return (status); 35554784fcbdSSowmini Varadhan } 355662ee1d25SArtem Kachitchkine 355762ee1d25SArtem Kachitchkine boolean_t 355862ee1d25SArtem Kachitchkine dladm_attr_is_linkprop(const char *name) 355962ee1d25SArtem Kachitchkine { 356062ee1d25SArtem Kachitchkine /* non-property attribute names */ 356162ee1d25SArtem Kachitchkine const char *nonprop[] = { 356262ee1d25SArtem Kachitchkine /* dlmgmtd core attributes */ 356362ee1d25SArtem Kachitchkine "name", 356462ee1d25SArtem Kachitchkine "class", 356562ee1d25SArtem Kachitchkine "media", 356662ee1d25SArtem Kachitchkine FPHYMAJ, 356762ee1d25SArtem Kachitchkine FPHYINST, 356862ee1d25SArtem Kachitchkine FDEVNAME, 356962ee1d25SArtem Kachitchkine 357062ee1d25SArtem Kachitchkine /* other attributes for vlan, aggr, etc */ 357162ee1d25SArtem Kachitchkine DLADM_ATTR_NAMES 357262ee1d25SArtem Kachitchkine }; 357362ee1d25SArtem Kachitchkine boolean_t is_nonprop = B_FALSE; 357462ee1d25SArtem Kachitchkine int i; 357562ee1d25SArtem Kachitchkine 357662ee1d25SArtem Kachitchkine for (i = 0; i < sizeof (nonprop) / sizeof (nonprop[0]); i++) { 357762ee1d25SArtem Kachitchkine if (strcmp(name, nonprop[i]) == 0) { 357862ee1d25SArtem Kachitchkine is_nonprop = B_TRUE; 357962ee1d25SArtem Kachitchkine break; 358062ee1d25SArtem Kachitchkine } 358162ee1d25SArtem Kachitchkine } 358262ee1d25SArtem Kachitchkine 358362ee1d25SArtem Kachitchkine return (!is_nonprop); 358462ee1d25SArtem Kachitchkine } 3585