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> 54e7801d59Ssowmini #include <inttypes.h> 55e7801d59Ssowmini #include <sys/ethernet.h> 562b24ab6bSSebastien Roy #include <inet/iptun.h> 57bcb5c89dSSowmini Varadhan #include <net/wpa.h> 58bcb5c89dSSowmini Varadhan #include <sys/sysmacros.h> 594eaa4710SRishi Srivatsavai #include <sys/vlan.h> 604eaa4710SRishi Srivatsavai #include <libdlbridge.h> 614eaa4710SRishi Srivatsavai #include <stp_in.h> 62f4b3ec61Sdh155122 63d62bc4baSyz147064 /* 64d62bc4baSyz147064 * The linkprop get() callback. 65da14cebeSEric Cheng * - pd: pointer to the prop_desc_t 66d62bc4baSyz147064 * - propstrp: a property string array to keep the returned property. 67d62bc4baSyz147064 * Caller allocated. 68d62bc4baSyz147064 * - cntp: number of returned properties. 69d62bc4baSyz147064 * Caller also uses it to indicate how many it expects. 70d62bc4baSyz147064 */ 71e7801d59Ssowmini struct prop_desc; 72da14cebeSEric Cheng typedef struct prop_desc prop_desc_t; 73e7801d59Ssowmini 744ac67f02SAnurag S. Maskey typedef dladm_status_t pd_getf_t(dladm_handle_t, prop_desc_t *pdp, 756b9e797cSsowmini datalink_id_t, char **propstp, uint_t *cntp, 76afdda45fSVasumathi Sundaram - Sun Microsystems datalink_media_t, uint_t, uint_t *); 77f4b3ec61Sdh155122 78d62bc4baSyz147064 /* 79d62bc4baSyz147064 * The linkprop set() callback. 80d62bc4baSyz147064 * - propval: a val_desc_t array which keeps the property values to be set. 81d62bc4baSyz147064 * - cnt: number of properties to be set. 82e7801d59Ssowmini * - flags: additional flags passed down the system call. 83e7801d59Ssowmini * 84e7801d59Ssowmini * pd_set takes val_desc_t given by pd_check(), translates it into 85e7801d59Ssowmini * a format suitable for kernel consumption. This may require allocation 86e7801d59Ssowmini * of ioctl buffers etc. pd_set() may call another common routine (used 87e7801d59Ssowmini * by all other pd_sets) which invokes the ioctl. 88d62bc4baSyz147064 */ 894ac67f02SAnurag S. Maskey typedef dladm_status_t pd_setf_t(dladm_handle_t, prop_desc_t *, datalink_id_t, 906b9e797cSsowmini val_desc_t *propval, uint_t cnt, uint_t flags, 916b9e797cSsowmini datalink_media_t); 92f4b3ec61Sdh155122 93d62bc4baSyz147064 /* 94d62bc4baSyz147064 * The linkprop check() callback. 95d62bc4baSyz147064 * - propstrp: property string array which keeps the property to be checked. 96d62bc4baSyz147064 * - cnt: number of properties. 97d62bc4baSyz147064 * - propval: return value; the property values of the given property strings. 98e7801d59Ssowmini * 99e7801d59Ssowmini * pd_check checks that the input values are valid. It does so by 100e7801d59Ssowmini * iteraring through the pd_modval list for the property. If 101e7801d59Ssowmini * the modifiable values cannot be expressed as a list, a pd_check 102e7801d59Ssowmini * specific to this property can be used. If the input values are 103e7801d59Ssowmini * verified to be valid, pd_check allocates a val_desc_t and fills it 104e7801d59Ssowmini * with either a val_desc_t found on the pd_modval list or something 105e7801d59Ssowmini * generated on the fly. 106d62bc4baSyz147064 */ 1074ac67f02SAnurag S. Maskey typedef dladm_status_t pd_checkf_t(dladm_handle_t, prop_desc_t *pdp, 1084ac67f02SAnurag S. Maskey datalink_id_t, char **propstrp, uint_t cnt, 1094ac67f02SAnurag S. Maskey val_desc_t *propval, datalink_media_t); 110f4b3ec61Sdh155122 111bcb5c89dSSowmini Varadhan typedef struct link_attr_s { 1123fd94f8cSam223141 mac_prop_id_t pp_id; 113e7801d59Ssowmini size_t pp_valsize; 114e7801d59Ssowmini char *pp_name; 115bcb5c89dSSowmini Varadhan } link_attr_t; 116e7801d59Ssowmini 117bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_name(size_t, datalink_id_t, 118bcb5c89dSSowmini Varadhan const char *, uint_t, dladm_status_t *); 119bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t *i_dladm_buf_alloc_by_id(size_t, datalink_id_t, 120da14cebeSEric Cheng mac_prop_id_t, uint_t, dladm_status_t *); 1214ac67f02SAnurag S. Maskey static dld_ioc_macprop_t *i_dladm_get_public_prop(dladm_handle_t, datalink_id_t, 1224ac67f02SAnurag S. Maskey char *, uint_t, dladm_status_t *, uint_t *); 123da14cebeSEric Cheng 1243361618bSRishi Srivatsavai static dladm_status_t i_dladm_set_private_prop(dladm_handle_t, datalink_id_t, 1254ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 12662ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_get_priv_prop(dladm_handle_t, datalink_id_t, 1274ac67f02SAnurag S. Maskey const char *, char **, uint_t *, dladm_prop_type_t, 1284ac67f02SAnurag S. Maskey uint_t); 129bcb5c89dSSowmini Varadhan static link_attr_t *dladm_name2prop(const char *); 130bcb5c89dSSowmini Varadhan static link_attr_t *dladm_id2prop(mac_prop_id_t); 131da14cebeSEric Cheng 132d62bc4baSyz147064 static pd_getf_t do_get_zone, do_get_autopush, do_get_rate_mod, 133d62bc4baSyz147064 do_get_rate_prop, do_get_channel_prop, 134e7801d59Ssowmini do_get_powermode_prop, do_get_radio_prop, 1353bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_duplex_get, i_dladm_status_get, 1363bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_binary_get, i_dladm_uint32_get, 13762ee1d25SArtem Kachitchkine i_dladm_flowctl_get, i_dladm_maxbw_get, 138e75f0919SSebastien Roy i_dladm_cpus_get, i_dladm_priority_get, 1394eaa4710SRishi Srivatsavai i_dladm_tagmode_get, i_dladm_range_get, 1404eaa4710SRishi Srivatsavai get_stp_prop, get_bridge_forward, 141*25ec3e3dSEric Cheng get_bridge_pvid, 142*25ec3e3dSEric Cheng /* the above need to be renamed to "do_get_xxx" */ 143*25ec3e3dSEric Cheng do_get_protection; 144da14cebeSEric Cheng 1453bc21d0aSAruna Ramakrishna - Sun Microsystems static pd_setf_t do_set_zone, do_set_rate_prop, 146e7801d59Ssowmini do_set_powermode_prop, do_set_radio_prop, 1474eaa4710SRishi Srivatsavai i_dladm_set_public_prop, do_set_res, do_set_cpus, 148*25ec3e3dSEric Cheng set_stp_prop, set_bridge_forward, set_bridge_pvid, 149*25ec3e3dSEric Cheng do_set_protection; 150f4b3ec61Sdh155122 151da14cebeSEric Cheng static pd_checkf_t do_check_zone, do_check_autopush, do_check_rate, 1522b24ab6bSSebastien Roy do_check_hoplimit, do_check_encaplim, 1534eaa4710SRishi Srivatsavai i_dladm_uint32_check, do_check_maxbw, do_check_cpus, 154*25ec3e3dSEric Cheng do_check_priority, check_stp_prop, check_bridge_pvid, 155*25ec3e3dSEric Cheng do_check_allowedips, do_check_prop; 156da14cebeSEric Cheng 1574ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_speed_get(dladm_handle_t, prop_desc_t *, 1584ac67f02SAnurag S. Maskey datalink_id_t, char **, uint_t *, uint_t, uint_t *); 1594ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_macprop(dladm_handle_t, void *, boolean_t); 160da14cebeSEric Cheng static const char *dladm_perm2str(uint_t, char *); 1616b9e797cSsowmini 162da14cebeSEric Cheng struct prop_desc { 163d62bc4baSyz147064 /* 164d62bc4baSyz147064 * link property name 165d62bc4baSyz147064 */ 166f4b3ec61Sdh155122 char *pd_name; 167d62bc4baSyz147064 168d62bc4baSyz147064 /* 169d62bc4baSyz147064 * default property value, can be set to { "", NULL } 170d62bc4baSyz147064 */ 171f4b3ec61Sdh155122 val_desc_t pd_defval; 172d62bc4baSyz147064 173d62bc4baSyz147064 /* 174d62bc4baSyz147064 * list of optional property values, can be NULL. 175d62bc4baSyz147064 * 176d62bc4baSyz147064 * This is set to non-NULL if there is a list of possible property 177d62bc4baSyz147064 * values. pd_optval would point to the array of possible values. 178d62bc4baSyz147064 */ 179d62bc4baSyz147064 val_desc_t *pd_optval; 180d62bc4baSyz147064 181d62bc4baSyz147064 /* 182d62bc4baSyz147064 * count of the above optional property values. 0 if pd_optval is NULL. 183d62bc4baSyz147064 */ 184d62bc4baSyz147064 uint_t pd_noptval; 185d62bc4baSyz147064 186d62bc4baSyz147064 /* 1874eaa4710SRishi Srivatsavai * callback to set link property; set to NULL if this property is 1884eaa4710SRishi Srivatsavai * read-only and may be called before or after permanent update; see 1894eaa4710SRishi Srivatsavai * flags. 190d62bc4baSyz147064 */ 191f4b3ec61Sdh155122 pd_setf_t *pd_set; 192d62bc4baSyz147064 193d62bc4baSyz147064 /* 194d62bc4baSyz147064 * callback to get modifiable link property 195d62bc4baSyz147064 */ 196f4b3ec61Sdh155122 pd_getf_t *pd_getmod; 197d62bc4baSyz147064 198d62bc4baSyz147064 /* 199d62bc4baSyz147064 * callback to get current link property 200d62bc4baSyz147064 */ 201f4b3ec61Sdh155122 pd_getf_t *pd_get; 202d62bc4baSyz147064 203d62bc4baSyz147064 /* 204d62bc4baSyz147064 * callback to validate link property value, set to NULL if pd_optval 205d62bc4baSyz147064 * is not NULL. In that case, validate the value by comparing it with 206d62bc4baSyz147064 * the pd_optval. Return a val_desc_t array pointer if the value is 207d62bc4baSyz147064 * valid. 208d62bc4baSyz147064 */ 209f4b3ec61Sdh155122 pd_checkf_t *pd_check; 210d62bc4baSyz147064 211d62bc4baSyz147064 uint_t pd_flags; 212e7801d59Ssowmini #define PD_TEMPONLY 0x1 /* property is temporary only */ 213e7801d59Ssowmini #define PD_CHECK_ALLOC 0x2 /* alloc vd_val as part of pd_check */ 2144eaa4710SRishi Srivatsavai #define PD_AFTER_PERM 0x4 /* pd_set after db update; no temporary */ 215d62bc4baSyz147064 /* 216d62bc4baSyz147064 * indicate link classes this property applies to. 217d62bc4baSyz147064 */ 218d62bc4baSyz147064 datalink_class_t pd_class; 219d62bc4baSyz147064 220d62bc4baSyz147064 /* 221d62bc4baSyz147064 * indicate link media type this property applies to. 222d62bc4baSyz147064 */ 223d62bc4baSyz147064 datalink_media_t pd_dmedia; 224da14cebeSEric Cheng }; 225f4b3ec61Sdh155122 2263fd94f8cSam223141 #define MAC_PROP_BUFSIZE(v) sizeof (dld_ioc_macprop_t) + (v) - 1 227e7801d59Ssowmini 228bcb5c89dSSowmini Varadhan /* 229bcb5c89dSSowmini Varadhan * Supported link properties enumerated in the prop_table[] array are 230bcb5c89dSSowmini Varadhan * computed using the callback functions in that array. To compute the 231bcb5c89dSSowmini Varadhan * property value, multiple distinct system calls may be needed (e.g., 232bcb5c89dSSowmini Varadhan * for wifi speed, we need to issue system calls to get desired/supported 233bcb5c89dSSowmini Varadhan * rates). The link_attr[] table enumerates the interfaces to the kernel, 234bcb5c89dSSowmini Varadhan * and the type/size of the data passed in the user-kernel interface. 235bcb5c89dSSowmini Varadhan */ 236bcb5c89dSSowmini Varadhan static link_attr_t link_attr[] = { 237bcb5c89dSSowmini Varadhan { MAC_PROP_DUPLEX, sizeof (link_duplex_t), "duplex"}, 238e7801d59Ssowmini 239bcb5c89dSSowmini Varadhan { MAC_PROP_SPEED, sizeof (uint64_t), "speed"}, 240e7801d59Ssowmini 241bcb5c89dSSowmini Varadhan { MAC_PROP_STATUS, sizeof (link_state_t), "state"}, 242e7801d59Ssowmini 243bcb5c89dSSowmini Varadhan { MAC_PROP_AUTONEG, sizeof (uint8_t), "adv_autoneg_cap"}, 244e7801d59Ssowmini 245bcb5c89dSSowmini Varadhan { MAC_PROP_MTU, sizeof (uint32_t), "mtu"}, 246e7801d59Ssowmini 247bcb5c89dSSowmini Varadhan { MAC_PROP_FLOWCTRL, sizeof (link_flowctrl_t), "flowctrl"}, 248e7801d59Ssowmini 249bcb5c89dSSowmini Varadhan { MAC_PROP_ZONE, sizeof (dld_ioc_zid_t), "zone"}, 250e7801d59Ssowmini 251bcb5c89dSSowmini Varadhan { MAC_PROP_AUTOPUSH, sizeof (struct dlautopush), "autopush"}, 2523bc21d0aSAruna Ramakrishna - Sun Microsystems 253aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_ADV_10GFDX_CAP, sizeof (uint8_t), "adv_10gfdx_cap"}, 254aca118b7Slucy wang - Sun Microsystems - Beijing China 255aca118b7Slucy wang - Sun Microsystems - Beijing China { MAC_PROP_EN_10GFDX_CAP, sizeof (uint8_t), "en_10gfdx_cap"}, 256aca118b7Slucy wang - Sun Microsystems - Beijing China 257bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000FDX_CAP, sizeof (uint8_t), "adv_1000fdx_cap"}, 2583bc21d0aSAruna Ramakrishna - Sun Microsystems 259bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000FDX_CAP, sizeof (uint8_t), "en_1000fdx_cap"}, 260e7801d59Ssowmini 261bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_1000HDX_CAP, sizeof (uint8_t), "adv_1000hdx_cap"}, 262e7801d59Ssowmini 263bcb5c89dSSowmini Varadhan { MAC_PROP_EN_1000HDX_CAP, sizeof (uint8_t), "en_1000hdx_cap"}, 264e7801d59Ssowmini 265bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100FDX_CAP, sizeof (uint8_t), "adv_100fdx_cap"}, 266e7801d59Ssowmini 267bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100FDX_CAP, sizeof (uint8_t), "en_100fdx_cap"}, 268e7801d59Ssowmini 269bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_100HDX_CAP, sizeof (uint8_t), "adv_100hdx_cap"}, 270e7801d59Ssowmini 271bcb5c89dSSowmini Varadhan { MAC_PROP_EN_100HDX_CAP, sizeof (uint8_t), "en_100hdx_cap"}, 272e7801d59Ssowmini 273bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10FDX_CAP, sizeof (uint8_t), "adv_10fdx_cap"}, 274e7801d59Ssowmini 275bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10FDX_CAP, sizeof (uint8_t), "en_10fdx_cap"}, 276e7801d59Ssowmini 277bcb5c89dSSowmini Varadhan { MAC_PROP_ADV_10HDX_CAP, sizeof (uint8_t), "adv_10hdx_cap"}, 278e7801d59Ssowmini 279bcb5c89dSSowmini Varadhan { MAC_PROP_EN_10HDX_CAP, sizeof (uint8_t), "en_10hdx_cap"}, 280e7801d59Ssowmini 281bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESSID, sizeof (wl_linkstatus_t), "essid"}, 282e7801d59Ssowmini 283bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSID, sizeof (wl_bssid_t), "bssid"}, 284bcb5c89dSSowmini Varadhan 285bcb5c89dSSowmini Varadhan { MAC_PROP_WL_BSSTYPE, sizeof (wl_bss_type_t), "bsstype"}, 286bcb5c89dSSowmini Varadhan 287bcb5c89dSSowmini Varadhan { MAC_PROP_WL_LINKSTATUS, sizeof (wl_linkstatus_t), "wl_linkstatus"}, 288bcb5c89dSSowmini Varadhan 289bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 290bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DESIRED_RATES, sizeof (wl_rates_t), "desired_rates"}, 291bcb5c89dSSowmini Varadhan 292bcb5c89dSSowmini Varadhan /* wl_rates_t has variable length */ 293bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SUPPORTED_RATES, sizeof (wl_rates_t), "supported_rates"}, 294bcb5c89dSSowmini Varadhan 295bcb5c89dSSowmini Varadhan { MAC_PROP_WL_AUTH_MODE, sizeof (wl_authmode_t), "authmode"}, 296bcb5c89dSSowmini Varadhan 297bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ENCRYPTION, sizeof (wl_encryption_t), "encryption"}, 298bcb5c89dSSowmini Varadhan 299bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RSSI, sizeof (wl_rssi_t), "signal"}, 300bcb5c89dSSowmini Varadhan 301bcb5c89dSSowmini Varadhan { MAC_PROP_WL_PHY_CONFIG, sizeof (wl_phy_conf_t), "phy_conf"}, 302bcb5c89dSSowmini Varadhan 303bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CAPABILITY, sizeof (wl_capability_t), "capability"}, 304bcb5c89dSSowmini Varadhan 305bcb5c89dSSowmini Varadhan { MAC_PROP_WL_WPA, sizeof (wl_wpa_t), "wpa"}, 306bcb5c89dSSowmini Varadhan 307bcb5c89dSSowmini Varadhan /* wl_wpa_ess_t has variable length */ 308bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SCANRESULTS, sizeof (wl_wpa_ess_t), "scan_results"}, 309bcb5c89dSSowmini Varadhan 310bcb5c89dSSowmini Varadhan { MAC_PROP_WL_POWER_MODE, sizeof (wl_ps_mode_t), "powermode"}, 311bcb5c89dSSowmini Varadhan 312bcb5c89dSSowmini Varadhan { MAC_PROP_WL_RADIO, sizeof (dladm_wlan_radio_t), "wl_radio"}, 313bcb5c89dSSowmini Varadhan 314bcb5c89dSSowmini Varadhan { MAC_PROP_WL_ESS_LIST, sizeof (wl_ess_list_t), "wl_ess_list"}, 315bcb5c89dSSowmini Varadhan 316bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY_TAB, sizeof (wl_wep_key_tab_t), "wl_wep_key"}, 317bcb5c89dSSowmini Varadhan 318bcb5c89dSSowmini Varadhan { MAC_PROP_WL_CREATE_IBSS, sizeof (wl_create_ibss_t), "createibss"}, 319bcb5c89dSSowmini Varadhan 320bcb5c89dSSowmini Varadhan /* wl_wpa_ie_t has variable length */ 321bcb5c89dSSowmini Varadhan { MAC_PROP_WL_SETOPTIE, sizeof (wl_wpa_ie_t), "set_ie"}, 322bcb5c89dSSowmini Varadhan 323bcb5c89dSSowmini Varadhan { MAC_PROP_WL_DELKEY, sizeof (wl_del_key_t), "wpa_del_key"}, 324bcb5c89dSSowmini Varadhan 325bcb5c89dSSowmini Varadhan { MAC_PROP_WL_KEY, sizeof (wl_key_t), "wl_key"}, 326bcb5c89dSSowmini Varadhan 327bcb5c89dSSowmini Varadhan { MAC_PROP_WL_MLME, sizeof (wl_mlme_t), "mlme"}, 328bcb5c89dSSowmini Varadhan 329da14cebeSEric Cheng { MAC_PROP_MAXBW, sizeof (mac_resource_props_t), "maxbw"}, 330da14cebeSEric Cheng 331da14cebeSEric Cheng { MAC_PROP_PRIO, sizeof (mac_resource_props_t), "priority"}, 332da14cebeSEric Cheng 333da14cebeSEric Cheng { MAC_PROP_BIND_CPU, sizeof (mac_resource_props_t), "cpus"}, 334da14cebeSEric Cheng 335e75f0919SSebastien Roy { MAC_PROP_TAGMODE, sizeof (link_tagmode_t), "tagmode"}, 336e75f0919SSebastien Roy 3372b24ab6bSSebastien Roy { MAC_PROP_IPTUN_HOPLIMIT, sizeof (uint32_t), "hoplimit"}, 3382b24ab6bSSebastien Roy 3392b24ab6bSSebastien Roy { MAC_PROP_IPTUN_ENCAPLIMIT, sizeof (uint32_t), "encaplimit"}, 3402b24ab6bSSebastien Roy 3414eaa4710SRishi Srivatsavai { MAC_PROP_PVID, sizeof (uint16_t), "default_tag"}, 3424eaa4710SRishi Srivatsavai 3434eaa4710SRishi Srivatsavai { MAC_PROP_LLIMIT, sizeof (uint32_t), "learn_limit"}, 3444eaa4710SRishi Srivatsavai 3454eaa4710SRishi Srivatsavai { MAC_PROP_LDECAY, sizeof (uint32_t), "learn_decay"}, 3464eaa4710SRishi Srivatsavai 347*25ec3e3dSEric Cheng { MAC_PROP_PROTECT, sizeof (mac_resource_props_t), "protection"}, 348da14cebeSEric Cheng 349*25ec3e3dSEric Cheng { MAC_PROP_PRIVATE, 0, "driver-private"} 350e7801d59Ssowmini }; 351e7801d59Ssowmini 3524eaa4710SRishi Srivatsavai typedef struct bridge_public_prop_s { 3534eaa4710SRishi Srivatsavai const char *bpp_name; 3544eaa4710SRishi Srivatsavai int bpp_code; 3554eaa4710SRishi Srivatsavai } bridge_public_prop_t; 3564eaa4710SRishi Srivatsavai 3574eaa4710SRishi Srivatsavai static const bridge_public_prop_t bridge_prop[] = { 3584eaa4710SRishi Srivatsavai { "stp", PT_CFG_NON_STP }, 3594eaa4710SRishi Srivatsavai { "stp_priority", PT_CFG_PRIO }, 3604eaa4710SRishi Srivatsavai { "stp_cost", PT_CFG_COST }, 3614eaa4710SRishi Srivatsavai { "stp_edge", PT_CFG_EDGE }, 3624eaa4710SRishi Srivatsavai { "stp_p2p", PT_CFG_P2P }, 3634eaa4710SRishi Srivatsavai { "stp_mcheck", PT_CFG_MCHECK }, 3644eaa4710SRishi Srivatsavai { NULL, 0 } 3654eaa4710SRishi Srivatsavai }; 3664eaa4710SRishi Srivatsavai 367e7801d59Ssowmini static val_desc_t link_duplex_vals[] = { 368e7801d59Ssowmini { "half", LINK_DUPLEX_HALF }, 369e7801d59Ssowmini { "full", LINK_DUPLEX_HALF } 370e7801d59Ssowmini }; 371e7801d59Ssowmini static val_desc_t link_status_vals[] = { 372e7801d59Ssowmini { "up", LINK_STATE_UP }, 373e7801d59Ssowmini { "down", LINK_STATE_DOWN } 374e7801d59Ssowmini }; 375e7801d59Ssowmini static val_desc_t link_01_vals[] = { 376e7801d59Ssowmini { "1", 1 }, 377e7801d59Ssowmini { "0", 0 } 378e7801d59Ssowmini }; 379e7801d59Ssowmini static val_desc_t link_flow_vals[] = { 380e7801d59Ssowmini { "no", LINK_FLOWCTRL_NONE }, 381e7801d59Ssowmini { "tx", LINK_FLOWCTRL_TX }, 382e7801d59Ssowmini { "rx", LINK_FLOWCTRL_RX }, 383e7801d59Ssowmini { "bi", LINK_FLOWCTRL_BI } 384e7801d59Ssowmini }; 385da14cebeSEric Cheng static val_desc_t link_priority_vals[] = { 386da14cebeSEric Cheng { "low", MPL_LOW }, 387da14cebeSEric Cheng { "medium", MPL_MEDIUM }, 388da14cebeSEric Cheng { "high", MPL_HIGH } 389da14cebeSEric Cheng }; 390e7801d59Ssowmini 391e75f0919SSebastien Roy static val_desc_t link_tagmode_vals[] = { 392e75f0919SSebastien Roy { "normal", LINK_TAGMODE_NORMAL }, 393e75f0919SSebastien Roy { "vlanonly", LINK_TAGMODE_VLANONLY } 394e75f0919SSebastien Roy }; 395e75f0919SSebastien Roy 396*25ec3e3dSEric Cheng static val_desc_t link_protect_vals[] = { 397*25ec3e3dSEric Cheng { "mac-nospoof", MPT_MACNOSPOOF }, 398*25ec3e3dSEric Cheng { "ip-nospoof", MPT_IPNOSPOOF }, 399*25ec3e3dSEric Cheng { "restricted", MPT_RESTRICTED } 400*25ec3e3dSEric Cheng }; 401*25ec3e3dSEric Cheng 402d62bc4baSyz147064 static val_desc_t dladm_wlan_radio_vals[] = { 403d62bc4baSyz147064 { "on", DLADM_WLAN_RADIO_ON }, 404d62bc4baSyz147064 { "off", DLADM_WLAN_RADIO_OFF } 405d62bc4baSyz147064 }; 406d62bc4baSyz147064 407d62bc4baSyz147064 static val_desc_t dladm_wlan_powermode_vals[] = { 408d62bc4baSyz147064 { "off", DLADM_WLAN_PM_OFF }, 409d62bc4baSyz147064 { "fast", DLADM_WLAN_PM_FAST }, 410d62bc4baSyz147064 { "max", DLADM_WLAN_PM_MAX } 411d62bc4baSyz147064 }; 412d62bc4baSyz147064 4134eaa4710SRishi Srivatsavai static val_desc_t stp_p2p_vals[] = { 4144eaa4710SRishi Srivatsavai { "true", P2P_FORCE_TRUE }, 4154eaa4710SRishi Srivatsavai { "false", P2P_FORCE_FALSE }, 4164eaa4710SRishi Srivatsavai { "auto", P2P_AUTO } 4174eaa4710SRishi Srivatsavai }; 4184eaa4710SRishi Srivatsavai 419da14cebeSEric Cheng #define VALCNT(vals) (sizeof ((vals)) / sizeof (val_desc_t)) 420da14cebeSEric Cheng #define RESET_VAL ((uintptr_t)-1) 421d62bc4baSyz147064 422da14cebeSEric Cheng static prop_desc_t prop_table[] = { 423e7801d59Ssowmini { "channel", { NULL, 0 }, 424e7801d59Ssowmini NULL, 0, NULL, NULL, 425d62bc4baSyz147064 do_get_channel_prop, NULL, 0, 426d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 427d62bc4baSyz147064 428d62bc4baSyz147064 { "powermode", { "off", DLADM_WLAN_PM_OFF }, 429d62bc4baSyz147064 dladm_wlan_powermode_vals, VALCNT(dladm_wlan_powermode_vals), 430d62bc4baSyz147064 do_set_powermode_prop, NULL, 431d62bc4baSyz147064 do_get_powermode_prop, NULL, 0, 432d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 433d62bc4baSyz147064 434d62bc4baSyz147064 { "radio", { "on", DLADM_WLAN_RADIO_ON }, 435d62bc4baSyz147064 dladm_wlan_radio_vals, VALCNT(dladm_wlan_radio_vals), 436d62bc4baSyz147064 do_set_radio_prop, NULL, 437d62bc4baSyz147064 do_get_radio_prop, NULL, 0, 438d62bc4baSyz147064 DATALINK_CLASS_PHYS, DL_WIFI }, 439d62bc4baSyz147064 440d62bc4baSyz147064 { "speed", { "", 0 }, NULL, 0, 441d62bc4baSyz147064 do_set_rate_prop, do_get_rate_mod, 442d62bc4baSyz147064 do_get_rate_prop, do_check_rate, 0, 4436b9e797cSsowmini DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE }, 444d62bc4baSyz147064 4454045d941Ssowmini { "autopush", { "", 0 }, NULL, 0, 4463bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, 4473bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_autopush, do_check_autopush, PD_CHECK_ALLOC, 448d62bc4baSyz147064 DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 449d62bc4baSyz147064 4504045d941Ssowmini { "zone", { "", 0 }, NULL, 0, 451f4b3ec61Sdh155122 do_set_zone, NULL, 4523bc21d0aSAruna Ramakrishna - Sun Microsystems do_get_zone, do_check_zone, PD_TEMPONLY|PD_CHECK_ALLOC, 453e7801d59Ssowmini DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 454e7801d59Ssowmini 4554045d941Ssowmini { "duplex", { "", 0 }, 456e7801d59Ssowmini link_duplex_vals, VALCNT(link_duplex_vals), 4573bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_duplex_get, NULL, 458e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 459e7801d59Ssowmini 4606b9e797cSsowmini { "state", { "up", LINK_STATE_UP }, 461e7801d59Ssowmini link_status_vals, VALCNT(link_status_vals), 4623bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_status_get, NULL, 4634045d941Ssowmini 0, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 464e7801d59Ssowmini 4650b8f0546SSowmini Varadhan { "adv_autoneg_cap", { "", 0 }, 466e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 4673bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 468e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 469e7801d59Ssowmini 4704045d941Ssowmini { "mtu", { "", 0 }, NULL, 0, 471f0f2c3a5SGirish Moodalbail i_dladm_set_public_prop, i_dladm_range_get, 4724eaa4710SRishi Srivatsavai i_dladm_uint32_get, i_dladm_uint32_check, 0, DATALINK_CLASS_ALL, 4733bc21d0aSAruna Ramakrishna - Sun Microsystems DATALINK_ANY_MEDIATYPE }, 474e7801d59Ssowmini 4754045d941Ssowmini { "flowctrl", { "", 0 }, 476e7801d59Ssowmini link_flow_vals, VALCNT(link_flow_vals), 4773bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_flowctl_get, NULL, 478e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 479e7801d59Ssowmini 480aca118b7Slucy wang - Sun Microsystems - Beijing China { "adv_10gfdx_cap", { "", 0 }, 481aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 482aca118b7Slucy wang - Sun Microsystems - Beijing China NULL, NULL, i_dladm_binary_get, NULL, 483aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 484aca118b7Slucy wang - Sun Microsystems - Beijing China 485aca118b7Slucy wang - Sun Microsystems - Beijing China { "en_10gfdx_cap", { "", 0 }, 486aca118b7Slucy wang - Sun Microsystems - Beijing China link_01_vals, VALCNT(link_01_vals), 487aca118b7Slucy wang - Sun Microsystems - Beijing China i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 488aca118b7Slucy wang - Sun Microsystems - Beijing China 0, DATALINK_CLASS_PHYS, DL_ETHER }, 489aca118b7Slucy wang - Sun Microsystems - Beijing China 4904045d941Ssowmini { "adv_1000fdx_cap", { "", 0 }, 4914045d941Ssowmini 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_1000fdx_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_1000hdx_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_1000hdx_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_100fdx_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_100fdx_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_100hdx_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_100hdx_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_10fdx_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_10fdx_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, 538e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 539e7801d59Ssowmini 5404045d941Ssowmini { "adv_10hdx_cap", { "", 0 }, 541e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5423bc21d0aSAruna Ramakrishna - Sun Microsystems NULL, NULL, i_dladm_binary_get, NULL, 543e7801d59Ssowmini 0, DATALINK_CLASS_PHYS, DL_ETHER }, 544e7801d59Ssowmini 5454045d941Ssowmini { "en_10hdx_cap", { "", 0 }, 546e7801d59Ssowmini link_01_vals, VALCNT(link_01_vals), 5473bc21d0aSAruna Ramakrishna - Sun Microsystems i_dladm_set_public_prop, NULL, i_dladm_binary_get, NULL, 548da14cebeSEric Cheng 0, DATALINK_CLASS_PHYS, DL_ETHER }, 549e7801d59Ssowmini 550da14cebeSEric Cheng { "maxbw", { "--", RESET_VAL }, NULL, 0, 551da14cebeSEric Cheng do_set_res, NULL, 55262ee1d25SArtem Kachitchkine i_dladm_maxbw_get, do_check_maxbw, PD_CHECK_ALLOC, 553da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 554da14cebeSEric Cheng 555da14cebeSEric Cheng { "cpus", { "--", RESET_VAL }, NULL, 0, 556da14cebeSEric Cheng do_set_cpus, NULL, 55762ee1d25SArtem Kachitchkine i_dladm_cpus_get, do_check_cpus, 0, 558da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 559da14cebeSEric Cheng 560da14cebeSEric Cheng { "priority", { "high", RESET_VAL }, 561da14cebeSEric Cheng link_priority_vals, VALCNT(link_priority_vals), do_set_res, NULL, 56262ee1d25SArtem Kachitchkine i_dladm_priority_get, do_check_priority, PD_CHECK_ALLOC, 563da14cebeSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 564e75f0919SSebastien Roy 565e75f0919SSebastien Roy { "tagmode", { "vlanonly", LINK_TAGMODE_VLANONLY }, 566e75f0919SSebastien Roy link_tagmode_vals, VALCNT(link_tagmode_vals), 567e75f0919SSebastien Roy i_dladm_set_public_prop, NULL, i_dladm_tagmode_get, 568e75f0919SSebastien Roy NULL, 0, 569e75f0919SSebastien Roy DATALINK_CLASS_PHYS | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC, 5704eaa4710SRishi Srivatsavai DL_ETHER }, 5714eaa4710SRishi Srivatsavai 5722b24ab6bSSebastien Roy { "hoplimit", { "", 0 }, NULL, 0, 5732b24ab6bSSebastien Roy i_dladm_set_public_prop, i_dladm_range_get, i_dladm_uint32_get, 5742b24ab6bSSebastien Roy do_check_hoplimit, 0, DATALINK_CLASS_IPTUN, DATALINK_ANY_MEDIATYPE}, 5752b24ab6bSSebastien Roy 5762b24ab6bSSebastien Roy { "encaplimit", { "", 0 }, NULL, 0, 5772b24ab6bSSebastien Roy i_dladm_set_public_prop, i_dladm_range_get, i_dladm_uint32_get, 5782b24ab6bSSebastien Roy do_check_encaplim, 0, DATALINK_CLASS_IPTUN, DL_IPV6}, 5792b24ab6bSSebastien Roy 5804eaa4710SRishi Srivatsavai { "forward", { "1", 1 }, 5814eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 5824eaa4710SRishi Srivatsavai set_bridge_forward, NULL, get_bridge_forward, NULL, PD_AFTER_PERM, 5834eaa4710SRishi Srivatsavai DATALINK_CLASS_ALL & ~DATALINK_CLASS_VNIC, DL_ETHER }, 5844eaa4710SRishi Srivatsavai 5854eaa4710SRishi Srivatsavai { "default_tag", { "1", 1 }, NULL, 0, 5864eaa4710SRishi Srivatsavai set_bridge_pvid, NULL, get_bridge_pvid, check_bridge_pvid, 5874eaa4710SRishi Srivatsavai 0, DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5884eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5894eaa4710SRishi Srivatsavai 5904eaa4710SRishi Srivatsavai { "learn_limit", { "1000", 1000 }, NULL, 0, 5914eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 5924eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 5934eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 5944eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 5954eaa4710SRishi Srivatsavai 5964eaa4710SRishi Srivatsavai { "learn_decay", { "200", 200 }, NULL, 0, 5974eaa4710SRishi Srivatsavai i_dladm_set_public_prop, NULL, i_dladm_uint32_get, 5984eaa4710SRishi Srivatsavai i_dladm_uint32_check, 0, 5994eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6004eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6014eaa4710SRishi Srivatsavai 6024eaa4710SRishi Srivatsavai { "stp", { "1", 1 }, 6034eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 6044eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, 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_priority", { "128", 128 }, NULL, 0, 6094eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6104eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6114eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6124eaa4710SRishi Srivatsavai 6134eaa4710SRishi Srivatsavai { "stp_cost", { "auto", 0 }, NULL, 0, 6144eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6154eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6164eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6174eaa4710SRishi Srivatsavai 6184eaa4710SRishi Srivatsavai { "stp_edge", { "1", 1 }, 6194eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 6204eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 6214eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6224eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6234eaa4710SRishi Srivatsavai 6244eaa4710SRishi Srivatsavai { "stp_p2p", { "auto", P2P_AUTO }, 6254eaa4710SRishi Srivatsavai stp_p2p_vals, VALCNT(stp_p2p_vals), 6264eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, NULL, PD_AFTER_PERM, 6274eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6284eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 6294eaa4710SRishi Srivatsavai 6304eaa4710SRishi Srivatsavai { "stp_mcheck", { "0", 0 }, 6314eaa4710SRishi Srivatsavai link_01_vals, VALCNT(link_01_vals), 6324eaa4710SRishi Srivatsavai set_stp_prop, NULL, get_stp_prop, check_stp_prop, PD_AFTER_PERM, 6334eaa4710SRishi Srivatsavai DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR| 6344eaa4710SRishi Srivatsavai DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER }, 635*25ec3e3dSEric Cheng 636*25ec3e3dSEric Cheng { "protection", { "--", RESET_VAL }, 637*25ec3e3dSEric Cheng link_protect_vals, VALCNT(link_protect_vals), 638*25ec3e3dSEric Cheng do_set_protection, NULL, do_get_protection, do_check_prop, 0, 639*25ec3e3dSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 640*25ec3e3dSEric Cheng 641*25ec3e3dSEric Cheng { "allowed-ips", { "--", 0 }, 642*25ec3e3dSEric Cheng NULL, 0, do_set_protection, NULL, 643*25ec3e3dSEric Cheng do_get_protection, do_check_allowedips, 0, 644*25ec3e3dSEric Cheng DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, 645f4b3ec61Sdh155122 }; 646f4b3ec61Sdh155122 647d62bc4baSyz147064 #define DLADM_MAX_PROPS (sizeof (prop_table) / sizeof (prop_desc_t)) 6480ba2cbe9Sxc151355 649da14cebeSEric Cheng static resource_prop_t rsrc_prop_table[] = { 650da14cebeSEric Cheng {"maxbw", do_extract_maxbw}, 651da14cebeSEric Cheng {"priority", do_extract_priority}, 652*25ec3e3dSEric Cheng {"cpus", do_extract_cpus}, 653*25ec3e3dSEric Cheng {"protection", do_extract_protection}, 654*25ec3e3dSEric Cheng {"allowed-ips", do_extract_allowedips} 655da14cebeSEric Cheng }; 656da14cebeSEric Cheng #define DLADM_MAX_RSRC_PROP (sizeof (rsrc_prop_table) / \ 657da14cebeSEric Cheng sizeof (resource_prop_t)) 658da14cebeSEric Cheng 659bcb5c89dSSowmini Varadhan /* 660bcb5c89dSSowmini Varadhan * when retrieving private properties, we pass down a buffer with 661bcb5c89dSSowmini Varadhan * DLADM_PROP_BUF_CHUNK of space for the driver to return the property value. 662bcb5c89dSSowmini Varadhan */ 663bcb5c89dSSowmini Varadhan #define DLADM_PROP_BUF_CHUNK 1024 664bcb5c89dSSowmini Varadhan 6654ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop_db(dladm_handle_t, datalink_id_t, 6664ac67f02SAnurag S. Maskey const char *, char **, uint_t); 6674ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_get_linkprop_db(dladm_handle_t, datalink_id_t, 6684ac67f02SAnurag S. Maskey const char *, char **, uint_t *); 66962ee1d25SArtem Kachitchkine static dladm_status_t i_dladm_walk_linkprop_priv_db(dladm_handle_t, 67062ee1d25SArtem Kachitchkine datalink_id_t, void *, int (*)(dladm_handle_t, 67162ee1d25SArtem Kachitchkine datalink_id_t, const char *, void *)); 6724ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_single_prop(dladm_handle_t, datalink_id_t, 6734ac67f02SAnurag S. Maskey datalink_class_t, uint32_t, prop_desc_t *, char **, 6744ac67f02SAnurag S. Maskey uint_t, uint_t); 6754ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_set_linkprop(dladm_handle_t, datalink_id_t, 6764ac67f02SAnurag S. Maskey const char *, char **, uint_t, uint_t); 6774ac67f02SAnurag S. Maskey static dladm_status_t i_dladm_getset_defval(dladm_handle_t, prop_desc_t *, 6784ac67f02SAnurag S. Maskey datalink_id_t, datalink_media_t, uint_t); 679da14cebeSEric Cheng 680d62bc4baSyz147064 /* 681d62bc4baSyz147064 * Unfortunately, MAX_SCAN_SUPPORT_RATES is too small to allow all 682d62bc4baSyz147064 * rates to be retrieved. However, we cannot increase it at this 683d62bc4baSyz147064 * time because it will break binary compatibility with unbundled 684d62bc4baSyz147064 * WiFi drivers and utilities. So for now we define an additional 685d62bc4baSyz147064 * constant, MAX_SUPPORT_RATES, to allow all rates to be retrieved. 686d62bc4baSyz147064 */ 687d62bc4baSyz147064 #define MAX_SUPPORT_RATES 64 688d62bc4baSyz147064 689d62bc4baSyz147064 #define AP_ANCHOR "[anchor]" 690d62bc4baSyz147064 #define AP_DELIMITER '.' 691d62bc4baSyz147064 692*25ec3e3dSEric Cheng /* ARGSUSED */ 693d62bc4baSyz147064 static dladm_status_t 694*25ec3e3dSEric Cheng do_check_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 695*25ec3e3dSEric Cheng char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 6960ba2cbe9Sxc151355 { 697d62bc4baSyz147064 int i, j; 6980ba2cbe9Sxc151355 699d62bc4baSyz147064 for (j = 0; j < val_cnt; j++) { 700d62bc4baSyz147064 for (i = 0; i < pdp->pd_noptval; i++) { 701*25ec3e3dSEric Cheng if (strcasecmp(prop_val[j], 702d62bc4baSyz147064 pdp->pd_optval[i].vd_name) == 0) { 7030ba2cbe9Sxc151355 break; 7040ba2cbe9Sxc151355 } 7050ba2cbe9Sxc151355 } 706*25ec3e3dSEric Cheng if (i == pdp->pd_noptval) 707*25ec3e3dSEric Cheng return (DLADM_STATUS_BADVAL); 7080ba2cbe9Sxc151355 709*25ec3e3dSEric Cheng (void) memcpy(&vdp[j], &pdp->pd_optval[i], sizeof (val_desc_t)); 710*25ec3e3dSEric Cheng } 711*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 7120ba2cbe9Sxc151355 } 7130ba2cbe9Sxc151355 7140ba2cbe9Sxc151355 static dladm_status_t 7154ac67f02SAnurag S. Maskey i_dladm_set_single_prop(dladm_handle_t handle, datalink_id_t linkid, 7164ac67f02SAnurag S. Maskey datalink_class_t class, uint32_t media, prop_desc_t *pdp, char **prop_val, 7174ac67f02SAnurag S. Maskey uint_t val_cnt, uint_t flags) 7180ba2cbe9Sxc151355 { 7190ba2cbe9Sxc151355 dladm_status_t status = DLADM_STATUS_OK; 720d62bc4baSyz147064 val_desc_t *vdp = NULL; 721d62bc4baSyz147064 boolean_t needfree = B_FALSE; 722d62bc4baSyz147064 uint_t cnt, i; 7230ba2cbe9Sxc151355 724d62bc4baSyz147064 if (!(pdp->pd_class & class)) 725d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 7260ba2cbe9Sxc151355 727d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 728d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 729d62bc4baSyz147064 730d62bc4baSyz147064 if ((flags & DLADM_OPT_PERSIST) && (pdp->pd_flags & PD_TEMPONLY)) 731d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 732d62bc4baSyz147064 733d62bc4baSyz147064 if (!(flags & DLADM_OPT_ACTIVE)) 734d62bc4baSyz147064 return (DLADM_STATUS_OK); 735d62bc4baSyz147064 736d62bc4baSyz147064 if (pdp->pd_set == NULL) 737d62bc4baSyz147064 return (DLADM_STATUS_PROPRDONLY); 738d62bc4baSyz147064 739d62bc4baSyz147064 if (prop_val != NULL) { 740d62bc4baSyz147064 vdp = malloc(sizeof (val_desc_t) * val_cnt); 741d62bc4baSyz147064 if (vdp == NULL) 742d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 743d62bc4baSyz147064 744d62bc4baSyz147064 if (pdp->pd_check != NULL) { 745da14cebeSEric Cheng needfree = ((pdp->pd_flags & PD_CHECK_ALLOC) != 0); 7464ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, prop_val, 7474ac67f02SAnurag S. Maskey val_cnt, vdp, media); 748d62bc4baSyz147064 } else if (pdp->pd_optval != NULL) { 749*25ec3e3dSEric Cheng status = do_check_prop(handle, pdp, linkid, prop_val, 750*25ec3e3dSEric Cheng val_cnt, vdp, media); 751d62bc4baSyz147064 } else { 752d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 7530ba2cbe9Sxc151355 } 7540ba2cbe9Sxc151355 755d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 756d62bc4baSyz147064 goto done; 757d62bc4baSyz147064 758d62bc4baSyz147064 cnt = val_cnt; 759d62bc4baSyz147064 } else { 760da14cebeSEric Cheng boolean_t defval = B_FALSE; 761da14cebeSEric Cheng 762d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) 763d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 764d62bc4baSyz147064 7653bc21d0aSAruna Ramakrishna - Sun Microsystems cnt = 1; 766da14cebeSEric Cheng defval = (strlen(pdp->pd_defval.vd_name) > 0); 767da14cebeSEric Cheng if ((pdp->pd_flags & PD_CHECK_ALLOC) != 0 || defval) { 768d62bc4baSyz147064 if ((vdp = malloc(sizeof (val_desc_t))) == NULL) 769d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 7703bc21d0aSAruna Ramakrishna - Sun Microsystems 771da14cebeSEric Cheng if (defval) { 772da14cebeSEric Cheng (void) memcpy(vdp, &pdp->pd_defval, 773da14cebeSEric Cheng sizeof (val_desc_t)); 774da14cebeSEric Cheng } else if (pdp->pd_check != NULL) { 7754ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, linkid, 7764ac67f02SAnurag S. Maskey prop_val, cnt, vdp, media); 7773bc21d0aSAruna Ramakrishna - Sun Microsystems if (status != DLADM_STATUS_OK) 7783bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 7793bc21d0aSAruna Ramakrishna - Sun Microsystems } 7804045d941Ssowmini } else { 7814ac67f02SAnurag S. Maskey status = i_dladm_getset_defval(handle, pdp, linkid, 7824045d941Ssowmini media, flags); 7834045d941Ssowmini return (status); 7844045d941Ssowmini } 785d62bc4baSyz147064 } 7864eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_AFTER_PERM) 7874eaa4710SRishi Srivatsavai status = (flags & DLADM_OPT_PERSIST) ? DLADM_STATUS_OK : 7884eaa4710SRishi Srivatsavai DLADM_STATUS_PERMONLY; 7894eaa4710SRishi Srivatsavai else 7904eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, vdp, cnt, flags, 7914eaa4710SRishi Srivatsavai media); 792d62bc4baSyz147064 if (needfree) { 793d62bc4baSyz147064 for (i = 0; i < cnt; i++) 794e7801d59Ssowmini free((void *)((val_desc_t *)vdp + i)->vd_val); 795d62bc4baSyz147064 } 796d62bc4baSyz147064 done: 797d62bc4baSyz147064 free(vdp); 798d62bc4baSyz147064 return (status); 799d62bc4baSyz147064 } 800d62bc4baSyz147064 801d62bc4baSyz147064 static dladm_status_t 8024ac67f02SAnurag S. Maskey i_dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 8034ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 804d62bc4baSyz147064 { 805d62bc4baSyz147064 int i; 806d62bc4baSyz147064 boolean_t found = B_FALSE; 807d62bc4baSyz147064 datalink_class_t class; 808d62bc4baSyz147064 uint32_t media; 809d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 810d62bc4baSyz147064 8114ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 8124ac67f02SAnurag S. Maskey NULL, 0); 813d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 8140ba2cbe9Sxc151355 return (status); 8150ba2cbe9Sxc151355 816d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 817d62bc4baSyz147064 prop_desc_t *pdp = &prop_table[i]; 818d62bc4baSyz147064 dladm_status_t s; 8190ba2cbe9Sxc151355 820d62bc4baSyz147064 if (prop_name != NULL && 821d62bc4baSyz147064 (strcasecmp(prop_name, pdp->pd_name) != 0)) 822d62bc4baSyz147064 continue; 823d62bc4baSyz147064 found = B_TRUE; 8244ac67f02SAnurag S. Maskey s = i_dladm_set_single_prop(handle, linkid, class, media, pdp, 8254ac67f02SAnurag S. Maskey prop_val, val_cnt, flags); 826d62bc4baSyz147064 827d62bc4baSyz147064 if (prop_name != NULL) { 828d62bc4baSyz147064 status = s; 829d62bc4baSyz147064 break; 830d62bc4baSyz147064 } else { 831d62bc4baSyz147064 if (s != DLADM_STATUS_OK && 832d62bc4baSyz147064 s != DLADM_STATUS_NOTSUP) 833d62bc4baSyz147064 status = s; 834d62bc4baSyz147064 } 835d62bc4baSyz147064 } 836e7801d59Ssowmini if (!found) { 837e7801d59Ssowmini if (prop_name[0] == '_') { 838e7801d59Ssowmini /* other private properties */ 8393361618bSRishi Srivatsavai status = i_dladm_set_private_prop(handle, linkid, 8403361618bSRishi Srivatsavai prop_name, prop_val, val_cnt, flags); 841e7801d59Ssowmini } else { 8420ba2cbe9Sxc151355 status = DLADM_STATUS_NOTFOUND; 843e7801d59Ssowmini } 844e7801d59Ssowmini } 8450ba2cbe9Sxc151355 8460ba2cbe9Sxc151355 return (status); 8470ba2cbe9Sxc151355 } 8480ba2cbe9Sxc151355 849d62bc4baSyz147064 /* 850d62bc4baSyz147064 * Set/reset link property for specific link 851d62bc4baSyz147064 */ 852d62bc4baSyz147064 dladm_status_t 8534ac67f02SAnurag S. Maskey dladm_set_linkprop(dladm_handle_t handle, datalink_id_t linkid, 8544ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 8550ba2cbe9Sxc151355 { 856d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 8570ba2cbe9Sxc151355 858d62bc4baSyz147064 if ((linkid == DATALINK_INVALID_LINKID) || (flags == 0) || 859d62bc4baSyz147064 (prop_val == NULL && val_cnt > 0) || 860d62bc4baSyz147064 (prop_val != NULL && val_cnt == 0) || 861d62bc4baSyz147064 (prop_name == NULL && prop_val != NULL)) { 862d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 8630ba2cbe9Sxc151355 } 8640ba2cbe9Sxc151355 8653361618bSRishi Srivatsavai /* 8663361618bSRishi Srivatsavai * Check for valid link property against the flags passed 8673361618bSRishi Srivatsavai * and set the link property when active flag is passed. 8683361618bSRishi Srivatsavai */ 8694ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop(handle, linkid, prop_name, prop_val, 870d62bc4baSyz147064 val_cnt, flags); 871d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 872d62bc4baSyz147064 return (status); 873d62bc4baSyz147064 874d62bc4baSyz147064 if (flags & DLADM_OPT_PERSIST) { 8754ac67f02SAnurag S. Maskey status = i_dladm_set_linkprop_db(handle, linkid, prop_name, 876d62bc4baSyz147064 prop_val, val_cnt); 8774eaa4710SRishi Srivatsavai 8784eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK && (flags & DLADM_OPT_ACTIVE)) { 8794eaa4710SRishi Srivatsavai prop_desc_t *pdp = prop_table; 8804eaa4710SRishi Srivatsavai int i; 8814eaa4710SRishi Srivatsavai 8824eaa4710SRishi Srivatsavai for (i = 0; i < DLADM_MAX_PROPS; i++, pdp++) { 8834eaa4710SRishi Srivatsavai if (!(pdp->pd_flags & PD_AFTER_PERM)) 8844eaa4710SRishi Srivatsavai continue; 8854eaa4710SRishi Srivatsavai if (prop_name != NULL && 8864eaa4710SRishi Srivatsavai strcasecmp(prop_name, pdp->pd_name) != 0) 8874eaa4710SRishi Srivatsavai continue; 8884eaa4710SRishi Srivatsavai status = pdp->pd_set(handle, pdp, linkid, NULL, 8894eaa4710SRishi Srivatsavai 0, flags, 0); 8904eaa4710SRishi Srivatsavai } 8914eaa4710SRishi Srivatsavai } 892d62bc4baSyz147064 } 893d62bc4baSyz147064 return (status); 894d62bc4baSyz147064 } 895d62bc4baSyz147064 896d62bc4baSyz147064 /* 89762ee1d25SArtem Kachitchkine * Walk all link properties of the given specific link. 89862ee1d25SArtem Kachitchkine * 89962ee1d25SArtem Kachitchkine * Note: this function currently lacks the ability to walk _all_ private 90062ee1d25SArtem Kachitchkine * properties if the link, because there is no kernel interface to 90162ee1d25SArtem Kachitchkine * retrieve all known private property names. Once such an interface 90262ee1d25SArtem Kachitchkine * is added, this function should be fixed accordingly. 903d62bc4baSyz147064 */ 904d62bc4baSyz147064 dladm_status_t 9054ac67f02SAnurag S. Maskey dladm_walk_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg, 9064ac67f02SAnurag S. Maskey int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 9070ba2cbe9Sxc151355 { 908d62bc4baSyz147064 dladm_status_t status; 909d62bc4baSyz147064 datalink_class_t class; 910d62bc4baSyz147064 uint_t media; 911d62bc4baSyz147064 int i; 9120ba2cbe9Sxc151355 913d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || func == NULL) 914d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 9150ba2cbe9Sxc151355 9164ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 9174ac67f02SAnurag S. Maskey NULL, 0); 918d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 919d62bc4baSyz147064 return (status); 920d62bc4baSyz147064 92162ee1d25SArtem Kachitchkine /* public */ 922d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) { 923d62bc4baSyz147064 if (!(prop_table[i].pd_class & class)) 924d62bc4baSyz147064 continue; 925d62bc4baSyz147064 926d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(prop_table[i].pd_dmedia, media)) 927d62bc4baSyz147064 continue; 928d62bc4baSyz147064 9294ac67f02SAnurag S. Maskey if (func(handle, linkid, prop_table[i].pd_name, arg) == 930d62bc4baSyz147064 DLADM_WALK_TERMINATE) { 931d62bc4baSyz147064 break; 932d62bc4baSyz147064 } 933d62bc4baSyz147064 } 934d62bc4baSyz147064 93562ee1d25SArtem Kachitchkine /* private */ 93662ee1d25SArtem Kachitchkine status = i_dladm_walk_linkprop_priv_db(handle, linkid, arg, func); 93762ee1d25SArtem Kachitchkine 93862ee1d25SArtem Kachitchkine return (status); 939d62bc4baSyz147064 } 940d62bc4baSyz147064 941d62bc4baSyz147064 /* 942d62bc4baSyz147064 * Get linkprop of the given specific link. 943d62bc4baSyz147064 */ 944d62bc4baSyz147064 dladm_status_t 9454ac67f02SAnurag S. Maskey dladm_get_linkprop(dladm_handle_t handle, datalink_id_t linkid, 9464ac67f02SAnurag S. Maskey dladm_prop_type_t type, const char *prop_name, char **prop_val, 9474ac67f02SAnurag S. Maskey uint_t *val_cntp) 948d62bc4baSyz147064 { 949d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 950d62bc4baSyz147064 datalink_class_t class; 951d62bc4baSyz147064 uint_t media; 952d62bc4baSyz147064 prop_desc_t *pdp; 9534045d941Ssowmini uint_t cnt, dld_flags = 0; 954d62bc4baSyz147064 int i; 955afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 956d62bc4baSyz147064 9574045d941Ssowmini if (type == DLADM_PROP_VAL_DEFAULT) 958f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_DEFAULT; 959f0f2c3a5SGirish Moodalbail else if (type == DLADM_PROP_VAL_MODIFIABLE) 960f0f2c3a5SGirish Moodalbail dld_flags |= MAC_PROP_POSSIBLE; 9614045d941Ssowmini 962d62bc4baSyz147064 if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 963d62bc4baSyz147064 prop_val == NULL || val_cntp == NULL || *val_cntp == 0) 964d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 965d62bc4baSyz147064 966d62bc4baSyz147064 for (i = 0; i < DLADM_MAX_PROPS; i++) 967d62bc4baSyz147064 if (strcasecmp(prop_name, prop_table[i].pd_name) == 0) 968d62bc4baSyz147064 break; 969d62bc4baSyz147064 970e7801d59Ssowmini if (i == DLADM_MAX_PROPS) { 971e7801d59Ssowmini if (prop_name[0] == '_') { 972e7801d59Ssowmini /* 973e7801d59Ssowmini * private property. 974e7801d59Ssowmini */ 97562ee1d25SArtem Kachitchkine if (type == DLADM_PROP_VAL_PERSISTENT) 97662ee1d25SArtem Kachitchkine return (i_dladm_get_linkprop_db(handle, linkid, 97762ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp)); 97862ee1d25SArtem Kachitchkine else 97962ee1d25SArtem Kachitchkine return (i_dladm_get_priv_prop(handle, linkid, 98062ee1d25SArtem Kachitchkine prop_name, prop_val, val_cntp, type, 98162ee1d25SArtem Kachitchkine dld_flags)); 982e7801d59Ssowmini } else { 983d62bc4baSyz147064 return (DLADM_STATUS_NOTFOUND); 984e7801d59Ssowmini } 985e7801d59Ssowmini } 986d62bc4baSyz147064 987d62bc4baSyz147064 pdp = &prop_table[i]; 988d62bc4baSyz147064 9894ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 9904ac67f02SAnurag S. Maskey NULL, 0); 991d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 992d62bc4baSyz147064 return (status); 993d62bc4baSyz147064 994d62bc4baSyz147064 if (!(pdp->pd_class & class)) 995d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 996d62bc4baSyz147064 997d62bc4baSyz147064 if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 998d62bc4baSyz147064 return (DLADM_STATUS_BADARG); 999d62bc4baSyz147064 1000d62bc4baSyz147064 switch (type) { 1001d62bc4baSyz147064 case DLADM_PROP_VAL_CURRENT: 10024ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 10034ac67f02SAnurag S. Maskey media, dld_flags, &perm_flags); 1004afdda45fSVasumathi Sundaram - Sun Microsystems break; 1005afdda45fSVasumathi Sundaram - Sun Microsystems 1006afdda45fSVasumathi Sundaram - Sun Microsystems case DLADM_PROP_VAL_PERM: 1007afdda45fSVasumathi Sundaram - Sun Microsystems if (pdp->pd_set == NULL) { 1008afdda45fSVasumathi Sundaram - Sun Microsystems perm_flags = MAC_PROP_PERM_READ; 1009afdda45fSVasumathi Sundaram - Sun Microsystems } else { 10104ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 10114ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 1012afdda45fSVasumathi Sundaram - Sun Microsystems } 1013afdda45fSVasumathi Sundaram - Sun Microsystems 1014afdda45fSVasumathi Sundaram - Sun Microsystems *prop_val[0] = '\0'; 101563a6526dSMichael Lim *val_cntp = 1; 1016da14cebeSEric Cheng if (status == DLADM_STATUS_OK) 1017da14cebeSEric Cheng (void) dladm_perm2str(perm_flags, *prop_val); 1018d62bc4baSyz147064 break; 1019d62bc4baSyz147064 1020d62bc4baSyz147064 case DLADM_PROP_VAL_DEFAULT: 102113a55820Sar224390 /* 102213a55820Sar224390 * If defaults are not defined for the property, 102313a55820Sar224390 * pd_defval.vd_name should be null. If the driver 102413a55820Sar224390 * has to be contacted for the value, vd_name should 102513a55820Sar224390 * be the empty string (""). Otherwise, dladm will 102613a55820Sar224390 * just print whatever is in the table. 102713a55820Sar224390 */ 1028d62bc4baSyz147064 if (pdp->pd_defval.vd_name == NULL) { 1029d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 1030d62bc4baSyz147064 break; 1031d62bc4baSyz147064 } 10324045d941Ssowmini 10334045d941Ssowmini if (strlen(pdp->pd_defval.vd_name) == 0) { 10344ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_val, 10354ac67f02SAnurag S. Maskey val_cntp, media, dld_flags, &perm_flags); 10364045d941Ssowmini } else { 1037d62bc4baSyz147064 (void) strcpy(*prop_val, pdp->pd_defval.vd_name); 10384045d941Ssowmini } 1039d62bc4baSyz147064 *val_cntp = 1; 1040d62bc4baSyz147064 break; 1041d62bc4baSyz147064 1042d62bc4baSyz147064 case DLADM_PROP_VAL_MODIFIABLE: 1043d62bc4baSyz147064 if (pdp->pd_getmod != NULL) { 10444ac67f02SAnurag S. Maskey status = pdp->pd_getmod(handle, pdp, linkid, prop_val, 1045afdda45fSVasumathi Sundaram - Sun Microsystems val_cntp, media, dld_flags, &perm_flags); 1046d62bc4baSyz147064 break; 1047d62bc4baSyz147064 } 1048d62bc4baSyz147064 cnt = pdp->pd_noptval; 1049d62bc4baSyz147064 if (cnt == 0) { 1050d62bc4baSyz147064 status = DLADM_STATUS_NOTSUP; 1051d62bc4baSyz147064 } else if (cnt > *val_cntp) { 1052d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 1053d62bc4baSyz147064 } else { 1054d62bc4baSyz147064 for (i = 0; i < cnt; i++) { 1055d62bc4baSyz147064 (void) strcpy(prop_val[i], 1056d62bc4baSyz147064 pdp->pd_optval[i].vd_name); 1057d62bc4baSyz147064 } 1058d62bc4baSyz147064 *val_cntp = cnt; 1059d62bc4baSyz147064 } 1060d62bc4baSyz147064 break; 1061d62bc4baSyz147064 case DLADM_PROP_VAL_PERSISTENT: 1062d62bc4baSyz147064 if (pdp->pd_flags & PD_TEMPONLY) 1063d62bc4baSyz147064 return (DLADM_STATUS_TEMPONLY); 10644ac67f02SAnurag S. Maskey status = i_dladm_get_linkprop_db(handle, linkid, prop_name, 1065d62bc4baSyz147064 prop_val, val_cntp); 1066d62bc4baSyz147064 break; 1067d62bc4baSyz147064 default: 1068d62bc4baSyz147064 status = DLADM_STATUS_BADARG; 1069d62bc4baSyz147064 break; 1070d62bc4baSyz147064 } 1071d62bc4baSyz147064 1072d62bc4baSyz147064 return (status); 1073d62bc4baSyz147064 } 1074d62bc4baSyz147064 10754eaa4710SRishi Srivatsavai /* 10764eaa4710SRishi Srivatsavai * Get linkprop of the given specific link and run any possible conversion 10774eaa4710SRishi Srivatsavai * of the values using the check function for the property. Fails if the 10784eaa4710SRishi Srivatsavai * check function doesn't succeed for the property value. 10794eaa4710SRishi Srivatsavai */ 10804eaa4710SRishi Srivatsavai dladm_status_t 10814eaa4710SRishi Srivatsavai dladm_get_linkprop_values(dladm_handle_t handle, datalink_id_t linkid, 10824eaa4710SRishi Srivatsavai dladm_prop_type_t type, const char *prop_name, uint_t *ret_val, 10834eaa4710SRishi Srivatsavai uint_t *val_cntp) 10844eaa4710SRishi Srivatsavai { 10854eaa4710SRishi Srivatsavai dladm_status_t status; 10864eaa4710SRishi Srivatsavai datalink_class_t class; 10874eaa4710SRishi Srivatsavai uint_t media; 10884eaa4710SRishi Srivatsavai prop_desc_t *pdp; 10894eaa4710SRishi Srivatsavai uint_t dld_flags; 10904eaa4710SRishi Srivatsavai int valc, i; 10914eaa4710SRishi Srivatsavai char **prop_val; 10924eaa4710SRishi Srivatsavai uint_t perm_flags; 10934eaa4710SRishi Srivatsavai 10944eaa4710SRishi Srivatsavai if (linkid == DATALINK_INVALID_LINKID || prop_name == NULL || 10954eaa4710SRishi Srivatsavai ret_val == NULL || val_cntp == NULL || *val_cntp == 0) 10964eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 10974eaa4710SRishi Srivatsavai 10984eaa4710SRishi Srivatsavai for (pdp = prop_table; pdp < prop_table + DLADM_MAX_PROPS; pdp++) 10994eaa4710SRishi Srivatsavai if (strcasecmp(prop_name, pdp->pd_name) == 0) 11004eaa4710SRishi Srivatsavai break; 11014eaa4710SRishi Srivatsavai 11024eaa4710SRishi Srivatsavai if (pdp == prop_table + DLADM_MAX_PROPS) 11034eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTFOUND); 11044eaa4710SRishi Srivatsavai 11054eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_CHECK_ALLOC) 11064eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 11074eaa4710SRishi Srivatsavai 11084eaa4710SRishi Srivatsavai status = dladm_datalink_id2info(handle, linkid, NULL, &class, &media, 11094eaa4710SRishi Srivatsavai NULL, 0); 11104eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 11114eaa4710SRishi Srivatsavai return (status); 11124eaa4710SRishi Srivatsavai 11134eaa4710SRishi Srivatsavai if (!(pdp->pd_class & class)) 11144eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 11154eaa4710SRishi Srivatsavai 11164eaa4710SRishi Srivatsavai if (!DATALINK_MEDIA_ACCEPTED(pdp->pd_dmedia, media)) 11174eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADARG); 11184eaa4710SRishi Srivatsavai 11194eaa4710SRishi Srivatsavai prop_val = malloc(*val_cntp * sizeof (*prop_val) + 11204eaa4710SRishi Srivatsavai *val_cntp * DLADM_PROP_VAL_MAX); 11214eaa4710SRishi Srivatsavai if (prop_val == NULL) 11224eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOMEM); 11234eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 11244eaa4710SRishi Srivatsavai prop_val[valc] = (char *)(prop_val + *val_cntp) + 11254eaa4710SRishi Srivatsavai valc * DLADM_PROP_VAL_MAX; 11264eaa4710SRishi Srivatsavai 11274eaa4710SRishi Srivatsavai dld_flags = (type == DLADM_PROP_VAL_DEFAULT) ? MAC_PROP_DEFAULT : 0; 11284eaa4710SRishi Srivatsavai 11294eaa4710SRishi Srivatsavai switch (type) { 11304eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_CURRENT: 11314eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 11324eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 11334eaa4710SRishi Srivatsavai break; 11344eaa4710SRishi Srivatsavai 11354eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_DEFAULT: 11364eaa4710SRishi Srivatsavai /* 11374eaa4710SRishi Srivatsavai * If defaults are not defined for the property, 11384eaa4710SRishi Srivatsavai * pd_defval.vd_name should be null. If the driver 11394eaa4710SRishi Srivatsavai * has to be contacted for the value, vd_name should 11404eaa4710SRishi Srivatsavai * be the empty string (""). Otherwise, dladm will 11414eaa4710SRishi Srivatsavai * just print whatever is in the table. 11424eaa4710SRishi Srivatsavai */ 11434eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name == NULL) { 11444eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOTSUP; 11454eaa4710SRishi Srivatsavai break; 11464eaa4710SRishi Srivatsavai } 11474eaa4710SRishi Srivatsavai 11484eaa4710SRishi Srivatsavai if (pdp->pd_defval.vd_name[0] != '\0') { 11494eaa4710SRishi Srivatsavai *val_cntp = 1; 11504eaa4710SRishi Srivatsavai *ret_val = pdp->pd_defval.vd_val; 11514eaa4710SRishi Srivatsavai free(prop_val); 11524eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 11534eaa4710SRishi Srivatsavai } 11544eaa4710SRishi Srivatsavai status = pdp->pd_get(handle, pdp, linkid, prop_val, val_cntp, 11554eaa4710SRishi Srivatsavai media, dld_flags, &perm_flags); 11564eaa4710SRishi Srivatsavai break; 11574eaa4710SRishi Srivatsavai 11584eaa4710SRishi Srivatsavai case DLADM_PROP_VAL_PERSISTENT: 11594eaa4710SRishi Srivatsavai if (pdp->pd_flags & PD_TEMPONLY) 11604eaa4710SRishi Srivatsavai status = DLADM_STATUS_TEMPONLY; 11614eaa4710SRishi Srivatsavai else 11624eaa4710SRishi Srivatsavai status = i_dladm_get_linkprop_db(handle, linkid, 11634eaa4710SRishi Srivatsavai prop_name, prop_val, val_cntp); 11644eaa4710SRishi Srivatsavai break; 11654eaa4710SRishi Srivatsavai 11664eaa4710SRishi Srivatsavai default: 11674eaa4710SRishi Srivatsavai status = DLADM_STATUS_BADARG; 11684eaa4710SRishi Srivatsavai break; 11694eaa4710SRishi Srivatsavai } 11704eaa4710SRishi Srivatsavai 11714eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 11724eaa4710SRishi Srivatsavai if (pdp->pd_check != NULL) { 11734eaa4710SRishi Srivatsavai val_desc_t *vdp; 11744eaa4710SRishi Srivatsavai 11754eaa4710SRishi Srivatsavai vdp = malloc(sizeof (val_desc_t) * *val_cntp); 11764eaa4710SRishi Srivatsavai if (vdp == NULL) 11774eaa4710SRishi Srivatsavai status = DLADM_STATUS_NOMEM; 11784eaa4710SRishi Srivatsavai else 11794eaa4710SRishi Srivatsavai status = pdp->pd_check(handle, pdp, linkid, 11804eaa4710SRishi Srivatsavai prop_val, *val_cntp, vdp, media); 11814eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 11824eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) 11834eaa4710SRishi Srivatsavai ret_val[valc] = vdp[valc].vd_val; 11844eaa4710SRishi Srivatsavai } 11854eaa4710SRishi Srivatsavai free(vdp); 11864eaa4710SRishi Srivatsavai } else { 11874eaa4710SRishi Srivatsavai for (valc = 0; valc < *val_cntp; valc++) { 11884eaa4710SRishi Srivatsavai for (i = 0; i < pdp->pd_noptval; i++) { 11894eaa4710SRishi Srivatsavai if (strcmp(pdp->pd_optval[i].vd_name, 11904eaa4710SRishi Srivatsavai prop_val[valc]) == 0) { 11914eaa4710SRishi Srivatsavai ret_val[valc] = 11924eaa4710SRishi Srivatsavai pdp->pd_optval[i].vd_val; 11934eaa4710SRishi Srivatsavai break; 11944eaa4710SRishi Srivatsavai } 11954eaa4710SRishi Srivatsavai } 11964eaa4710SRishi Srivatsavai if (i == pdp->pd_noptval) { 11974eaa4710SRishi Srivatsavai status = DLADM_STATUS_FAILED; 11984eaa4710SRishi Srivatsavai break; 11994eaa4710SRishi Srivatsavai } 12004eaa4710SRishi Srivatsavai } 12014eaa4710SRishi Srivatsavai } 12024eaa4710SRishi Srivatsavai } 12034eaa4710SRishi Srivatsavai 12044eaa4710SRishi Srivatsavai free(prop_val); 12054eaa4710SRishi Srivatsavai 12064eaa4710SRishi Srivatsavai return (status); 12074eaa4710SRishi Srivatsavai } 12084eaa4710SRishi Srivatsavai 1209d62bc4baSyz147064 /*ARGSUSED*/ 1210d62bc4baSyz147064 static int 12114ac67f02SAnurag S. Maskey i_dladm_init_one_prop(dladm_handle_t handle, datalink_id_t linkid, 12124ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 1213d62bc4baSyz147064 { 1214d62bc4baSyz147064 char *buf, **propvals; 1215d62bc4baSyz147064 uint_t i, valcnt = DLADM_MAX_PROP_VALCNT; 1216d62bc4baSyz147064 1217d62bc4baSyz147064 if ((buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) * 1218d62bc4baSyz147064 DLADM_MAX_PROP_VALCNT)) == NULL) { 1219d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1220d62bc4baSyz147064 } 1221d62bc4baSyz147064 1222d62bc4baSyz147064 propvals = (char **)(void *)buf; 1223d62bc4baSyz147064 for (i = 0; i < valcnt; i++) { 1224d62bc4baSyz147064 propvals[i] = buf + 1225d62bc4baSyz147064 sizeof (char *) * DLADM_MAX_PROP_VALCNT + 1226d62bc4baSyz147064 i * DLADM_PROP_VAL_MAX; 1227d62bc4baSyz147064 } 1228d62bc4baSyz147064 12294ac67f02SAnurag S. Maskey if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 12304ac67f02SAnurag S. Maskey prop_name, propvals, &valcnt) != DLADM_STATUS_OK) { 1231d62bc4baSyz147064 goto done; 1232d62bc4baSyz147064 } 1233d62bc4baSyz147064 12344ac67f02SAnurag S. Maskey (void) dladm_set_linkprop(handle, linkid, prop_name, propvals, valcnt, 1235d62bc4baSyz147064 DLADM_OPT_ACTIVE); 1236d62bc4baSyz147064 1237d62bc4baSyz147064 done: 1238d62bc4baSyz147064 if (buf != NULL) 1239d62bc4baSyz147064 free(buf); 1240d62bc4baSyz147064 1241d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 1242d62bc4baSyz147064 } 1243d62bc4baSyz147064 1244d62bc4baSyz147064 /*ARGSUSED*/ 1245d62bc4baSyz147064 static int 12464ac67f02SAnurag S. Maskey i_dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, void *arg) 1247d62bc4baSyz147064 { 1248da14cebeSEric Cheng datalink_class_t class; 1249da14cebeSEric Cheng dladm_status_t status; 1250da14cebeSEric Cheng 12514ac67f02SAnurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL, 12524ac67f02SAnurag S. Maskey NULL, 0); 1253da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 1254da14cebeSEric Cheng return (DLADM_WALK_TERMINATE); 1255da14cebeSEric Cheng 1256da14cebeSEric Cheng if ((class & (DATALINK_CLASS_VNIC | DATALINK_CLASS_VLAN)) == 0) 12574ac67f02SAnurag S. Maskey (void) dladm_init_linkprop(handle, linkid, B_TRUE); 1258da14cebeSEric Cheng 1259d62bc4baSyz147064 return (DLADM_WALK_CONTINUE); 12600ba2cbe9Sxc151355 } 12610ba2cbe9Sxc151355 12620ba2cbe9Sxc151355 dladm_status_t 12634ac67f02SAnurag S. Maskey dladm_init_linkprop(dladm_handle_t handle, datalink_id_t linkid, 12644ac67f02SAnurag S. Maskey boolean_t any_media) 12650ba2cbe9Sxc151355 { 126630890389Sartem datalink_media_t dmedia; 126730890389Sartem uint32_t media; 126830890389Sartem 126930890389Sartem dmedia = any_media ? DATALINK_ANY_MEDIATYPE : DL_WIFI; 127030890389Sartem 1271d62bc4baSyz147064 if (linkid == DATALINK_ALL_LINKID) { 12724ac67f02SAnurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_init_linkprop, handle, 12734ac67f02SAnurag S. Maskey NULL, DATALINK_CLASS_ALL, dmedia, DLADM_OPT_PERSIST); 12744ac67f02SAnurag S. Maskey } else if (any_media || 12754ac67f02SAnurag S. Maskey ((dladm_datalink_id2info(handle, linkid, NULL, NULL, &media, NULL, 12764ac67f02SAnurag S. Maskey 0) == DLADM_STATUS_OK) && 127730890389Sartem DATALINK_MEDIA_ACCEPTED(dmedia, media))) { 12784ac67f02SAnurag S. Maskey (void) dladm_walk_linkprop(handle, linkid, NULL, 12794ac67f02SAnurag S. Maskey i_dladm_init_one_prop); 1280d62bc4baSyz147064 } 1281d62bc4baSyz147064 return (DLADM_STATUS_OK); 12820ba2cbe9Sxc151355 } 1283f4b3ec61Sdh155122 1284e7801d59Ssowmini /* ARGSUSED */ 1285f4b3ec61Sdh155122 static dladm_status_t 12864ac67f02SAnurag S. Maskey do_get_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1287da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1288da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1289f4b3ec61Sdh155122 { 1290d62bc4baSyz147064 char zone_name[ZONENAME_MAX]; 1291d62bc4baSyz147064 zoneid_t zid; 1292d62bc4baSyz147064 dladm_status_t status; 12933bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 12943bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1295f4b3ec61Sdh155122 12964045d941Ssowmini if (flags != 0) 12974045d941Ssowmini return (DLADM_STATUS_NOTSUP); 12984045d941Ssowmini 12994ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1300da14cebeSEric Cheng &status, perm_flags); 1301d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 1302d62bc4baSyz147064 return (status); 1303d62bc4baSyz147064 13043bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 13053bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid, cp, sizeof (zid)); 13063bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 13073bc21d0aSAruna Ramakrishna - Sun Microsystems 1308d62bc4baSyz147064 *val_cnt = 1; 1309d62bc4baSyz147064 if (zid != GLOBAL_ZONEID) { 1310afdda45fSVasumathi Sundaram - Sun Microsystems if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) { 1311f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1312afdda45fSVasumathi Sundaram - Sun Microsystems } 1313f4b3ec61Sdh155122 1314d62bc4baSyz147064 (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX); 131547a01978Sbw } else { 1316d62bc4baSyz147064 *prop_val[0] = '\0'; 131747a01978Sbw } 1318f4b3ec61Sdh155122 1319f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1320f4b3ec61Sdh155122 } 1321f4b3ec61Sdh155122 1322f4b3ec61Sdh155122 typedef int (*zone_get_devroot_t)(char *, char *, size_t); 1323f4b3ec61Sdh155122 1324f4b3ec61Sdh155122 static int 1325f4b3ec61Sdh155122 i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen) 1326f4b3ec61Sdh155122 { 1327f4b3ec61Sdh155122 char root[MAXPATHLEN]; 1328f4b3ec61Sdh155122 zone_get_devroot_t real_zone_get_devroot; 1329f4b3ec61Sdh155122 void *dlhandle; 1330f4b3ec61Sdh155122 void *sym; 1331f4b3ec61Sdh155122 int ret; 1332f4b3ec61Sdh155122 1333f4b3ec61Sdh155122 if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL) 1334f4b3ec61Sdh155122 return (-1); 1335f4b3ec61Sdh155122 1336f4b3ec61Sdh155122 if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) { 1337f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1338f4b3ec61Sdh155122 return (-1); 1339f4b3ec61Sdh155122 } 1340f4b3ec61Sdh155122 1341f4b3ec61Sdh155122 real_zone_get_devroot = (zone_get_devroot_t)sym; 1342f4b3ec61Sdh155122 1343f4b3ec61Sdh155122 if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0) 1344f4b3ec61Sdh155122 (void) snprintf(dev, devlen, "%s%s", root, "/dev"); 1345f4b3ec61Sdh155122 (void) dlclose(dlhandle); 1346f4b3ec61Sdh155122 return (ret); 1347f4b3ec61Sdh155122 } 1348f4b3ec61Sdh155122 1349f4b3ec61Sdh155122 static dladm_status_t 13504ac67f02SAnurag S. Maskey i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid, 13514ac67f02SAnurag S. Maskey datalink_id_t linkid, boolean_t add) 1352f4b3ec61Sdh155122 { 1353f4b3ec61Sdh155122 char path[MAXPATHLEN]; 1354d62bc4baSyz147064 char name[MAXLINKNAMELEN]; 1355f4b3ec61Sdh155122 di_prof_t prof = NULL; 1356f4b3ec61Sdh155122 char zone_name[ZONENAME_MAX]; 1357f4b3ec61Sdh155122 dladm_status_t status; 1358d62bc4baSyz147064 int ret; 1359f4b3ec61Sdh155122 1360f4b3ec61Sdh155122 if (getzonenamebyid(zid, zone_name, sizeof (zone_name)) < 0) 1361f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1362f4b3ec61Sdh155122 if (i_dladm_get_zone_dev(zone_name, path, sizeof (path)) != 0) 1363f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1364f4b3ec61Sdh155122 if (di_prof_init(path, &prof) != 0) 1365f4b3ec61Sdh155122 return (dladm_errno2status(errno)); 1366f4b3ec61Sdh155122 13674ac67f02SAnurag S. Maskey status = dladm_linkid2legacyname(handle, linkid, name, MAXLINKNAMELEN); 1368f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1369d62bc4baSyz147064 goto cleanup; 1370f4b3ec61Sdh155122 1371d62bc4baSyz147064 if (add) 1372d62bc4baSyz147064 ret = di_prof_add_dev(prof, name); 1373d62bc4baSyz147064 else 1374d62bc4baSyz147064 ret = di_prof_add_exclude(prof, name); 1375f4b3ec61Sdh155122 1376d62bc4baSyz147064 if (ret != 0) { 1377d62bc4baSyz147064 status = dladm_errno2status(errno); 1378d62bc4baSyz147064 goto cleanup; 1379f4b3ec61Sdh155122 } 1380f4b3ec61Sdh155122 1381d62bc4baSyz147064 if (di_prof_commit(prof) != 0) 1382d62bc4baSyz147064 status = dladm_errno2status(errno); 1383d62bc4baSyz147064 cleanup: 1384d62bc4baSyz147064 if (prof) 1385d62bc4baSyz147064 di_prof_fini(prof); 1386d62bc4baSyz147064 1387d62bc4baSyz147064 return (status); 1388f4b3ec61Sdh155122 } 1389f4b3ec61Sdh155122 1390e7801d59Ssowmini /* ARGSUSED */ 1391f4b3ec61Sdh155122 static dladm_status_t 13924ac67f02SAnurag S. Maskey do_set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 13934ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1394f4b3ec61Sdh155122 { 13953bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 1396f4b3ec61Sdh155122 zoneid_t zid_old, zid_new; 13973bc21d0aSAruna Ramakrishna - Sun Microsystems char *cp; 13983bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 13993bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1400f4b3ec61Sdh155122 1401f4b3ec61Sdh155122 if (val_cnt != 1) 1402f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1403f4b3ec61Sdh155122 14043bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = (dld_ioc_zid_t *)vdp->vd_val; 14053bc21d0aSAruna Ramakrishna - Sun Microsystems 14064ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1407da14cebeSEric Cheng &status, NULL); 1408f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 1409f4b3ec61Sdh155122 return (status); 1410f4b3ec61Sdh155122 14113bc21d0aSAruna Ramakrishna - Sun Microsystems cp = dip->pr_val; 14123bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&zid_old, cp, sizeof (zid_old)); 14133bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 1414f4b3ec61Sdh155122 14153bc21d0aSAruna Ramakrishna - Sun Microsystems zid_new = dzp->diz_zid; 14163bc21d0aSAruna Ramakrishna - Sun Microsystems if (zid_new == zid_old) 14172b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 14182b24ab6bSSebastien Roy 14192b24ab6bSSebastien Roy if ((status = i_dladm_set_public_prop(handle, pdp, linkid, vdp, val_cnt, 14202b24ab6bSSebastien Roy flags, media)) != DLADM_STATUS_OK) 14213bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 14223bc21d0aSAruna Ramakrishna - Sun Microsystems 1423d62bc4baSyz147064 /* 14242b24ab6bSSebastien Roy * It is okay to fail to update the /dev entry (some vanity-named 14252b24ab6bSSebastien Roy * links do not have a /dev entry). 1426d62bc4baSyz147064 */ 1427d62bc4baSyz147064 if (zid_old != GLOBAL_ZONEID) { 14284ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_old, linkid, 14294ac67f02SAnurag S. Maskey B_FALSE); 1430d62bc4baSyz147064 } 14312b24ab6bSSebastien Roy if (zid_new != GLOBAL_ZONEID) 14324ac67f02SAnurag S. Maskey (void) i_dladm_update_deventry(handle, zid_new, linkid, B_TRUE); 1433f4b3ec61Sdh155122 1434f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 1435f4b3ec61Sdh155122 } 1436f4b3ec61Sdh155122 1437f4b3ec61Sdh155122 /* ARGSUSED */ 1438f4b3ec61Sdh155122 static dladm_status_t 14394ac67f02SAnurag S. Maskey do_check_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 14404ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1441f4b3ec61Sdh155122 { 14423bc21d0aSAruna Ramakrishna - Sun Microsystems char *zone_name; 14433bc21d0aSAruna Ramakrishna - Sun Microsystems zoneid_t zoneid; 14443bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK; 14453bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_zid_t *dzp; 1446f4b3ec61Sdh155122 1447f4b3ec61Sdh155122 if (val_cnt != 1) 1448f4b3ec61Sdh155122 return (DLADM_STATUS_BADVALCNT); 1449f4b3ec61Sdh155122 14503bc21d0aSAruna Ramakrishna - Sun Microsystems dzp = malloc(sizeof (dld_ioc_zid_t)); 14513bc21d0aSAruna Ramakrishna - Sun Microsystems if (dzp == NULL) 14523bc21d0aSAruna Ramakrishna - Sun Microsystems return (DLADM_STATUS_NOMEM); 1453f4b3ec61Sdh155122 1454da14cebeSEric Cheng zone_name = (prop_val != NULL) ? *prop_val : GLOBAL_ZONENAME; 14553bc21d0aSAruna Ramakrishna - Sun Microsystems if ((zoneid = getzoneidbyname(zone_name)) == -1) { 14563bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14573bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 14583bc21d0aSAruna Ramakrishna - Sun Microsystems } 14593bc21d0aSAruna Ramakrishna - Sun Microsystems 14603bc21d0aSAruna Ramakrishna - Sun Microsystems if (zoneid != GLOBAL_ZONEID) { 1461f4b3ec61Sdh155122 ushort_t flags; 1462f4b3ec61Sdh155122 14633bc21d0aSAruna Ramakrishna - Sun Microsystems if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &flags, 1464f4b3ec61Sdh155122 sizeof (flags)) < 0) { 14653bc21d0aSAruna Ramakrishna - Sun Microsystems status = dladm_errno2status(errno); 14663bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1467f4b3ec61Sdh155122 } 1468f4b3ec61Sdh155122 1469f4b3ec61Sdh155122 if (!(flags & ZF_NET_EXCL)) { 14703bc21d0aSAruna Ramakrishna - Sun Microsystems status = DLADM_STATUS_BADVAL; 14713bc21d0aSAruna Ramakrishna - Sun Microsystems goto done; 1472f4b3ec61Sdh155122 } 1473f4b3ec61Sdh155122 } 1474f4b3ec61Sdh155122 14753bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memset(dzp, 0, sizeof (dld_ioc_zid_t)); 14763bc21d0aSAruna Ramakrishna - Sun Microsystems 14773bc21d0aSAruna Ramakrishna - Sun Microsystems dzp->diz_zid = zoneid; 14782b24ab6bSSebastien Roy dzp->diz_linkid = linkid; 14793bc21d0aSAruna Ramakrishna - Sun Microsystems 14803bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = (uintptr_t)dzp; 1481f4b3ec61Sdh155122 return (DLADM_STATUS_OK); 14823bc21d0aSAruna Ramakrishna - Sun Microsystems done: 14833bc21d0aSAruna Ramakrishna - Sun Microsystems free(dzp); 14843bc21d0aSAruna Ramakrishna - Sun Microsystems return (status); 1485f4b3ec61Sdh155122 } 1486f4b3ec61Sdh155122 1487e7801d59Ssowmini /* ARGSUSED */ 1488f4b3ec61Sdh155122 static dladm_status_t 148962ee1d25SArtem Kachitchkine i_dladm_maxbw_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1490da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1491da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1492da14cebeSEric Cheng { 1493da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1494da14cebeSEric Cheng mac_resource_props_t mrp; 1495da14cebeSEric Cheng dladm_status_t status; 1496da14cebeSEric Cheng 14974ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1498da14cebeSEric Cheng &status, perm_flags); 1499da14cebeSEric Cheng if (dip == NULL) 1500da14cebeSEric Cheng return (status); 1501da14cebeSEric Cheng 1502da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1503da14cebeSEric Cheng free(dip); 1504da14cebeSEric Cheng 1505da14cebeSEric Cheng if ((mrp.mrp_mask & MRP_MAXBW) == 0) { 1506da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1507da14cebeSEric Cheng } else { 1508da14cebeSEric Cheng (void) dladm_bw2str(mrp.mrp_maxbw, prop_val[0]); 1509da14cebeSEric Cheng } 1510da14cebeSEric Cheng *val_cnt = 1; 1511da14cebeSEric Cheng return (DLADM_STATUS_OK); 1512da14cebeSEric Cheng } 1513da14cebeSEric Cheng 1514da14cebeSEric Cheng /* ARGSUSED */ 1515da14cebeSEric Cheng static dladm_status_t 15164ac67f02SAnurag S. Maskey do_check_maxbw(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 15174ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1518da14cebeSEric Cheng { 1519da14cebeSEric Cheng uint64_t *maxbw; 1520da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1521da14cebeSEric Cheng 1522da14cebeSEric Cheng if (val_cnt != 1) 1523da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1524da14cebeSEric Cheng 1525da14cebeSEric Cheng maxbw = malloc(sizeof (uint64_t)); 1526da14cebeSEric Cheng if (maxbw == NULL) 1527da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1528da14cebeSEric Cheng 1529da14cebeSEric Cheng status = dladm_str2bw(*prop_val, maxbw); 1530da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1531da14cebeSEric Cheng free(maxbw); 1532da14cebeSEric Cheng return (status); 1533da14cebeSEric Cheng } 1534da14cebeSEric Cheng 1535da14cebeSEric Cheng if ((*maxbw < MRP_MAXBW_MINVAL) && (*maxbw != 0)) { 1536da14cebeSEric Cheng free(maxbw); 1537da14cebeSEric Cheng return (DLADM_STATUS_MINMAXBW); 1538da14cebeSEric Cheng } 1539da14cebeSEric Cheng 1540da14cebeSEric Cheng vdp->vd_val = (uintptr_t)maxbw; 1541da14cebeSEric Cheng return (DLADM_STATUS_OK); 1542da14cebeSEric Cheng } 1543da14cebeSEric Cheng 1544da14cebeSEric Cheng /* ARGSUSED */ 1545da14cebeSEric Cheng dladm_status_t 1546*25ec3e3dSEric Cheng do_extract_maxbw(val_desc_t *vdp, uint_t cnt, void *arg) 1547da14cebeSEric Cheng { 1548*25ec3e3dSEric Cheng mac_resource_props_t *mrp = arg; 1549da14cebeSEric Cheng 1550da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_maxbw, sizeof (uint64_t)); 1551da14cebeSEric Cheng mrp->mrp_mask |= MRP_MAXBW; 1552da14cebeSEric Cheng 1553da14cebeSEric Cheng return (DLADM_STATUS_OK); 1554da14cebeSEric Cheng } 1555da14cebeSEric Cheng 1556da14cebeSEric Cheng /* ARGSUSED */ 1557da14cebeSEric Cheng static dladm_status_t 155862ee1d25SArtem Kachitchkine i_dladm_cpus_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1559da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1560da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1561da14cebeSEric Cheng { 1562da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1563da14cebeSEric Cheng mac_resource_props_t mrp; 1564da14cebeSEric Cheng int i; 1565da14cebeSEric Cheng uint32_t ncpus; 1566da14cebeSEric Cheng uchar_t *cp; 1567da14cebeSEric Cheng dladm_status_t status; 1568da14cebeSEric Cheng 15694ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1570da14cebeSEric Cheng &status, perm_flags); 1571da14cebeSEric Cheng if (dip == NULL) 1572da14cebeSEric Cheng return (status); 1573da14cebeSEric Cheng 1574da14cebeSEric Cheng cp = (uchar_t *)dip->pr_val; 1575da14cebeSEric Cheng (void) memcpy(&mrp, cp, sizeof (mac_resource_props_t)); 1576da14cebeSEric Cheng free(dip); 1577da14cebeSEric Cheng 1578da14cebeSEric Cheng ncpus = mrp.mrp_ncpus; 1579da14cebeSEric Cheng 1580da14cebeSEric Cheng if (ncpus > *val_cnt) 1581da14cebeSEric Cheng return (DLADM_STATUS_TOOSMALL); 1582da14cebeSEric Cheng 1583da14cebeSEric Cheng if (ncpus == 0) { 1584da14cebeSEric Cheng (*prop_val)[0] = '\0'; 1585da14cebeSEric Cheng *val_cnt = 1; 1586da14cebeSEric Cheng return (DLADM_STATUS_OK); 1587da14cebeSEric Cheng } 1588da14cebeSEric Cheng 1589da14cebeSEric Cheng *val_cnt = ncpus; 1590da14cebeSEric Cheng for (i = 0; i < ncpus; i++) { 1591da14cebeSEric Cheng (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 1592da14cebeSEric Cheng "%u", mrp.mrp_cpu[i]); 1593da14cebeSEric Cheng } 1594da14cebeSEric Cheng return (DLADM_STATUS_OK); 1595da14cebeSEric Cheng } 1596da14cebeSEric Cheng 1597da14cebeSEric Cheng /* ARGSUSED */ 1598da14cebeSEric Cheng static dladm_status_t 15994ac67f02SAnurag S. Maskey do_set_res(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16004ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1601da14cebeSEric Cheng { 1602da14cebeSEric Cheng mac_resource_props_t mrp; 1603da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1604da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1605da14cebeSEric Cheng 1606da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1607da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1608da14cebeSEric Cheng flags, &status); 1609da14cebeSEric Cheng 1610da14cebeSEric Cheng if (dip == NULL) 1611da14cebeSEric Cheng return (status); 1612da14cebeSEric Cheng 1613da14cebeSEric Cheng if (vdp->vd_val == RESET_VAL) { 1614da14cebeSEric Cheng switch (dip->pr_num) { 1615da14cebeSEric Cheng case MAC_PROP_MAXBW: 1616da14cebeSEric Cheng mrp.mrp_maxbw = MRP_MAXBW_RESETVAL; 1617da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1618da14cebeSEric Cheng break; 1619da14cebeSEric Cheng case MAC_PROP_PRIO: 1620da14cebeSEric Cheng mrp.mrp_priority = MPL_RESET; 1621da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1622da14cebeSEric Cheng break; 1623da14cebeSEric Cheng default: 1624da14cebeSEric Cheng free(dip); 1625da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1626da14cebeSEric Cheng } 1627da14cebeSEric Cheng } else { 1628da14cebeSEric Cheng switch (dip->pr_num) { 1629da14cebeSEric Cheng case MAC_PROP_MAXBW: 1630da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_maxbw, 1631da14cebeSEric Cheng sizeof (uint64_t)); 1632da14cebeSEric Cheng mrp.mrp_mask = MRP_MAXBW; 1633da14cebeSEric Cheng break; 1634da14cebeSEric Cheng case MAC_PROP_PRIO: 1635da14cebeSEric Cheng bcopy((void *)vdp->vd_val, &mrp.mrp_priority, 1636da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1637da14cebeSEric Cheng mrp.mrp_mask = MRP_PRIORITY; 1638da14cebeSEric Cheng break; 1639da14cebeSEric Cheng default: 1640da14cebeSEric Cheng free(dip); 1641da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1642da14cebeSEric Cheng } 1643da14cebeSEric Cheng } 1644da14cebeSEric Cheng 1645da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 16464ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1647da14cebeSEric Cheng free(dip); 1648da14cebeSEric Cheng return (status); 1649da14cebeSEric Cheng } 1650da14cebeSEric Cheng 1651da14cebeSEric Cheng /* ARGSUSED */ 1652da14cebeSEric Cheng static dladm_status_t 16534ac67f02SAnurag S. Maskey do_set_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 16544ac67f02SAnurag S. Maskey val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 1655da14cebeSEric Cheng { 1656da14cebeSEric Cheng mac_resource_props_t mrp; 1657da14cebeSEric Cheng dladm_status_t status; 1658da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1659da14cebeSEric Cheng datalink_class_t class; 1660da14cebeSEric Cheng 1661da14cebeSEric Cheng /* 1662da14cebeSEric Cheng * CPU bindings can be set on VNIC and regular physical links. 1663da14cebeSEric Cheng * However VNICs fails the dladm_phys_info test(). So apply 1664da14cebeSEric Cheng * the phys_info test only on physical links. 1665da14cebeSEric Cheng */ 16664ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, 1667da14cebeSEric Cheng NULL, NULL, 0)) != DLADM_STATUS_OK) { 1668da14cebeSEric Cheng return (status); 1669da14cebeSEric Cheng } 1670da14cebeSEric Cheng 1671da14cebeSEric Cheng /* 1672da14cebeSEric Cheng * We set intr_cpu to -1. The interrupt will be retargetted, 1673da14cebeSEric Cheng * if possible when the setup is complete in MAC. 1674da14cebeSEric Cheng */ 1675da14cebeSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1676da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1677da14cebeSEric Cheng if (vdp != NULL && vdp->vd_val != RESET_VAL) { 1678da14cebeSEric Cheng mac_resource_props_t *vmrp; 1679da14cebeSEric Cheng 1680da14cebeSEric Cheng vmrp = (mac_resource_props_t *)vdp->vd_val; 1681da14cebeSEric Cheng if (vmrp->mrp_ncpus > 0) { 1682da14cebeSEric Cheng bcopy(vmrp, &mrp, sizeof (mac_resource_props_t)); 1683da14cebeSEric Cheng mrp.mrp_mask = MRP_CPUS; 1684da14cebeSEric Cheng } 1685da14cebeSEric Cheng mrp.mrp_mask |= MRP_CPUS_USERSPEC; 1686da14cebeSEric Cheng mrp.mrp_fanout_mode = MCM_CPUS; 1687da14cebeSEric Cheng mrp.mrp_intr_cpu = -1; 1688da14cebeSEric Cheng } 1689da14cebeSEric Cheng 1690da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 1691da14cebeSEric Cheng flags, &status); 1692da14cebeSEric Cheng if (dip == NULL) 1693da14cebeSEric Cheng return (status); 1694da14cebeSEric Cheng 1695da14cebeSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 16964ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 1697da14cebeSEric Cheng free(dip); 1698da14cebeSEric Cheng return (status); 1699da14cebeSEric Cheng } 1700da14cebeSEric Cheng 1701da14cebeSEric Cheng /* ARGSUSED */ 1702da14cebeSEric Cheng static dladm_status_t 17034ac67f02SAnurag S. Maskey do_check_cpus(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 17044ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1705da14cebeSEric Cheng { 1706da14cebeSEric Cheng uint32_t cpuid; 1707da14cebeSEric Cheng int i, j, rc; 1708da14cebeSEric Cheng long nproc = sysconf(_SC_NPROCESSORS_CONF); 1709da14cebeSEric Cheng mac_resource_props_t *mrp; 1710da14cebeSEric Cheng 1711da14cebeSEric Cheng mrp = malloc(sizeof (mac_resource_props_t)); 1712da14cebeSEric Cheng if (mrp == NULL) 1713da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1714da14cebeSEric Cheng 1715da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1716da14cebeSEric Cheng errno = 0; 1717da14cebeSEric Cheng cpuid = strtol(prop_val[i], (char **)NULL, 10); 1718da14cebeSEric Cheng if (errno != 0 || cpuid >= nproc) { 1719da14cebeSEric Cheng free(mrp); 1720da14cebeSEric Cheng return (DLADM_STATUS_CPUMAX); 1721da14cebeSEric Cheng } 1722da14cebeSEric Cheng rc = p_online(cpuid, P_STATUS); 1723da14cebeSEric Cheng if (rc < 1) { 1724da14cebeSEric Cheng free(mrp); 1725da14cebeSEric Cheng return (DLADM_STATUS_CPUERR); 1726da14cebeSEric Cheng } 1727da14cebeSEric Cheng if (rc != P_ONLINE) { 1728da14cebeSEric Cheng free(mrp); 1729da14cebeSEric Cheng return (DLADM_STATUS_CPUNOTONLINE); 1730da14cebeSEric Cheng } 1731da14cebeSEric Cheng mrp->mrp_cpu[i] = cpuid; 1732da14cebeSEric Cheng } 1733da14cebeSEric Cheng mrp->mrp_ncpus = (uint32_t)val_cnt; 1734da14cebeSEric Cheng 1735da14cebeSEric Cheng /* Check for duplicates */ 1736da14cebeSEric Cheng for (i = 0; i < val_cnt; i++) { 1737da14cebeSEric Cheng for (j = 0; j < val_cnt; j++) { 1738da14cebeSEric Cheng if (i != j && mrp->mrp_cpu[i] == mrp->mrp_cpu[j]) { 1739da14cebeSEric Cheng free(mrp); 1740da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 1741da14cebeSEric Cheng } 1742da14cebeSEric Cheng } 1743da14cebeSEric Cheng } 1744da14cebeSEric Cheng vdp->vd_val = (uintptr_t)mrp; 1745da14cebeSEric Cheng 1746da14cebeSEric Cheng return (DLADM_STATUS_OK); 1747da14cebeSEric Cheng } 1748da14cebeSEric Cheng 1749da14cebeSEric Cheng /* ARGSUSED */ 1750da14cebeSEric Cheng dladm_status_t 1751*25ec3e3dSEric Cheng do_extract_cpus(val_desc_t *vdp, uint_t cnt, void *arg) 1752da14cebeSEric Cheng { 1753*25ec3e3dSEric Cheng mac_resource_props_t *mrp = arg; 1754da14cebeSEric Cheng mac_resource_props_t *vmrp = (mac_resource_props_t *)vdp->vd_val; 1755da14cebeSEric Cheng int i; 1756da14cebeSEric Cheng 1757da14cebeSEric Cheng for (i = 0; i < vmrp->mrp_ncpus; i++) { 1758da14cebeSEric Cheng mrp->mrp_cpu[i] = vmrp->mrp_cpu[i]; 1759da14cebeSEric Cheng } 1760da14cebeSEric Cheng mrp->mrp_ncpus = vmrp->mrp_ncpus; 1761da14cebeSEric Cheng mrp->mrp_mask |= (MRP_CPUS|MRP_CPUS_USERSPEC); 1762da14cebeSEric Cheng mrp->mrp_fanout_mode = MCM_CPUS; 176363a6526dSMichael Lim mrp->mrp_intr_cpu = -1; 1764da14cebeSEric Cheng 1765da14cebeSEric Cheng return (DLADM_STATUS_OK); 1766da14cebeSEric Cheng } 1767da14cebeSEric Cheng 1768da14cebeSEric Cheng /* ARGSUSED */ 1769da14cebeSEric Cheng static dladm_status_t 177062ee1d25SArtem Kachitchkine i_dladm_priority_get(dladm_handle_t handle, prop_desc_t *pdp, 177162ee1d25SArtem Kachitchkine datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 177262ee1d25SArtem Kachitchkine datalink_media_t media, uint_t flags, uint_t *perm_flags) 1773da14cebeSEric Cheng { 1774da14cebeSEric Cheng dld_ioc_macprop_t *dip; 1775da14cebeSEric Cheng mac_resource_props_t mrp; 1776da14cebeSEric Cheng mac_priority_level_t pri; 1777da14cebeSEric Cheng dladm_status_t status; 1778da14cebeSEric Cheng 17794ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 1780da14cebeSEric Cheng &status, perm_flags); 1781da14cebeSEric Cheng if (dip == NULL) 1782da14cebeSEric Cheng return (status); 1783da14cebeSEric Cheng 1784da14cebeSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1785da14cebeSEric Cheng free(dip); 1786da14cebeSEric Cheng 1787da14cebeSEric Cheng pri = ((mrp.mrp_mask & MRP_PRIORITY) == 0) ? MPL_HIGH : 1788da14cebeSEric Cheng mrp.mrp_priority; 1789da14cebeSEric Cheng 1790da14cebeSEric Cheng (void) dladm_pri2str(pri, prop_val[0]); 1791da14cebeSEric Cheng *val_cnt = 1; 1792da14cebeSEric Cheng return (DLADM_STATUS_OK); 1793da14cebeSEric Cheng } 1794da14cebeSEric Cheng 1795da14cebeSEric Cheng /* ARGSUSED */ 1796da14cebeSEric Cheng static dladm_status_t 17974ac67f02SAnurag S. Maskey do_check_priority(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 17984ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 1799da14cebeSEric Cheng { 1800da14cebeSEric Cheng mac_priority_level_t *pri; 1801da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1802da14cebeSEric Cheng 1803da14cebeSEric Cheng if (val_cnt != 1) 1804da14cebeSEric Cheng return (DLADM_STATUS_BADVALCNT); 1805da14cebeSEric Cheng 1806da14cebeSEric Cheng pri = malloc(sizeof (mac_priority_level_t)); 1807da14cebeSEric Cheng if (pri == NULL) 1808da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 1809da14cebeSEric Cheng 1810da14cebeSEric Cheng status = dladm_str2pri(*prop_val, pri); 1811da14cebeSEric Cheng if (status != DLADM_STATUS_OK) { 1812da14cebeSEric Cheng free(pri); 1813da14cebeSEric Cheng return (status); 1814da14cebeSEric Cheng } 1815da14cebeSEric Cheng 1816da14cebeSEric Cheng if (*pri < MPL_LOW || *pri > MPL_HIGH) { 1817da14cebeSEric Cheng free(pri); 1818da14cebeSEric Cheng return (DLADM_STATUS_BADVAL); 1819da14cebeSEric Cheng } 1820da14cebeSEric Cheng 1821da14cebeSEric Cheng vdp->vd_val = (uintptr_t)pri; 1822da14cebeSEric Cheng return (DLADM_STATUS_OK); 1823da14cebeSEric Cheng } 1824da14cebeSEric Cheng 1825da14cebeSEric Cheng /* ARGSUSED */ 1826da14cebeSEric Cheng dladm_status_t 1827*25ec3e3dSEric Cheng do_extract_priority(val_desc_t *vdp, uint_t cnt, void *arg) 1828da14cebeSEric Cheng { 1829*25ec3e3dSEric Cheng mac_resource_props_t *mrp = arg; 1830da14cebeSEric Cheng 1831da14cebeSEric Cheng bcopy((char *)vdp->vd_val, &mrp->mrp_priority, 1832da14cebeSEric Cheng sizeof (mac_priority_level_t)); 1833da14cebeSEric Cheng mrp->mrp_mask |= MRP_PRIORITY; 1834da14cebeSEric Cheng 1835da14cebeSEric Cheng return (DLADM_STATUS_OK); 1836da14cebeSEric Cheng } 1837da14cebeSEric Cheng 1838da14cebeSEric Cheng /* ARGSUSED */ 1839da14cebeSEric Cheng static dladm_status_t 1840*25ec3e3dSEric Cheng do_set_protection(dladm_handle_t handle, prop_desc_t *pdp, 1841*25ec3e3dSEric Cheng datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, 1842*25ec3e3dSEric Cheng uint_t flags, datalink_media_t media) 1843*25ec3e3dSEric Cheng { 1844*25ec3e3dSEric Cheng mac_resource_props_t mrp; 1845*25ec3e3dSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 1846*25ec3e3dSEric Cheng dld_ioc_macprop_t *dip; 1847*25ec3e3dSEric Cheng 1848*25ec3e3dSEric Cheng bzero(&mrp, sizeof (mac_resource_props_t)); 1849*25ec3e3dSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, "protection", 1850*25ec3e3dSEric Cheng flags, &status); 1851*25ec3e3dSEric Cheng 1852*25ec3e3dSEric Cheng if (dip == NULL) 1853*25ec3e3dSEric Cheng return (status); 1854*25ec3e3dSEric Cheng 1855*25ec3e3dSEric Cheng if (strcmp(pdp->pd_name, "protection") == 0) { 1856*25ec3e3dSEric Cheng status = do_extract_protection(vdp, val_cnt, &mrp); 1857*25ec3e3dSEric Cheng if (status != DLADM_STATUS_OK) 1858*25ec3e3dSEric Cheng goto done; 1859*25ec3e3dSEric Cheng 1860*25ec3e3dSEric Cheng } else if (strcmp(pdp->pd_name, "allowed-ips") == 0) { 1861*25ec3e3dSEric Cheng status = do_extract_allowedips(vdp, val_cnt, &mrp); 1862*25ec3e3dSEric Cheng if (status != DLADM_STATUS_OK) 1863*25ec3e3dSEric Cheng goto done; 1864*25ec3e3dSEric Cheng } else { 1865*25ec3e3dSEric Cheng status = DLADM_STATUS_BADARG; 1866*25ec3e3dSEric Cheng goto done; 1867*25ec3e3dSEric Cheng } 1868*25ec3e3dSEric Cheng 1869*25ec3e3dSEric Cheng (void) memcpy(dip->pr_val, &mrp, dip->pr_valsize); 1870*25ec3e3dSEric Cheng status = i_dladm_macprop(handle, dip, B_TRUE); 1871*25ec3e3dSEric Cheng 1872*25ec3e3dSEric Cheng done: 1873*25ec3e3dSEric Cheng free(dip); 1874*25ec3e3dSEric Cheng return (status); 1875*25ec3e3dSEric Cheng } 1876*25ec3e3dSEric Cheng 1877*25ec3e3dSEric Cheng /* ARGSUSED */ 1878*25ec3e3dSEric Cheng static dladm_status_t 1879*25ec3e3dSEric Cheng do_get_protection(dladm_handle_t handle, prop_desc_t *pdp, 1880*25ec3e3dSEric Cheng datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 1881*25ec3e3dSEric Cheng datalink_media_t media, uint_t flags, uint_t *perm_flags) 1882*25ec3e3dSEric Cheng { 1883*25ec3e3dSEric Cheng dld_ioc_macprop_t *dip; 1884*25ec3e3dSEric Cheng mac_resource_props_t mrp; 1885*25ec3e3dSEric Cheng mac_protect_t *p; 1886*25ec3e3dSEric Cheng dladm_status_t status; 1887*25ec3e3dSEric Cheng int i; 1888*25ec3e3dSEric Cheng 1889*25ec3e3dSEric Cheng dip = i_dladm_get_public_prop(handle, linkid, "protection", flags, 1890*25ec3e3dSEric Cheng &status, perm_flags); 1891*25ec3e3dSEric Cheng if (dip == NULL) 1892*25ec3e3dSEric Cheng return (status); 1893*25ec3e3dSEric Cheng 1894*25ec3e3dSEric Cheng bcopy(dip->pr_val, &mrp, sizeof (mac_resource_props_t)); 1895*25ec3e3dSEric Cheng free(dip); 1896*25ec3e3dSEric Cheng 1897*25ec3e3dSEric Cheng p = &mrp.mrp_protect; 1898*25ec3e3dSEric Cheng if ((mrp.mrp_mask & MRP_PROTECT) != 0 && 1899*25ec3e3dSEric Cheng strcmp(pdp->pd_name, "protection") == 0) { 1900*25ec3e3dSEric Cheng uint32_t cnt = 0, setbits[32]; 1901*25ec3e3dSEric Cheng 1902*25ec3e3dSEric Cheng dladm_find_setbits32(p->mp_types, setbits, &cnt); 1903*25ec3e3dSEric Cheng if (cnt > *val_cnt) 1904*25ec3e3dSEric Cheng return (DLADM_STATUS_BADVALCNT); 1905*25ec3e3dSEric Cheng 1906*25ec3e3dSEric Cheng for (i = 0; i < cnt; i++) 1907*25ec3e3dSEric Cheng (void) dladm_protect2str(setbits[i], prop_val[i]); 1908*25ec3e3dSEric Cheng 1909*25ec3e3dSEric Cheng *val_cnt = cnt; 1910*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1911*25ec3e3dSEric Cheng } 1912*25ec3e3dSEric Cheng 1913*25ec3e3dSEric Cheng if (p->mp_ipaddrcnt > 0 && 1914*25ec3e3dSEric Cheng strcmp(pdp->pd_name, "allowed-ips") == 0) { 1915*25ec3e3dSEric Cheng if (p->mp_ipaddrcnt > *val_cnt) 1916*25ec3e3dSEric Cheng return (DLADM_STATUS_BADVALCNT); 1917*25ec3e3dSEric Cheng 1918*25ec3e3dSEric Cheng for (i = 0; i < p->mp_ipaddrcnt; i++) { 1919*25ec3e3dSEric Cheng (void) dladm_ipv4addr2str(&p->mp_ipaddrs[i], 1920*25ec3e3dSEric Cheng prop_val[i]); 1921*25ec3e3dSEric Cheng } 1922*25ec3e3dSEric Cheng *val_cnt = p->mp_ipaddrcnt; 1923*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1924*25ec3e3dSEric Cheng } 1925*25ec3e3dSEric Cheng 1926*25ec3e3dSEric Cheng *val_cnt = 0; 1927*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1928*25ec3e3dSEric Cheng } 1929*25ec3e3dSEric Cheng 1930*25ec3e3dSEric Cheng dladm_status_t 1931*25ec3e3dSEric Cheng do_extract_protection(val_desc_t *vdp, uint_t cnt, void *arg) 1932*25ec3e3dSEric Cheng { 1933*25ec3e3dSEric Cheng mac_resource_props_t *mrp = arg; 1934*25ec3e3dSEric Cheng uint32_t types = 0; 1935*25ec3e3dSEric Cheng int i; 1936*25ec3e3dSEric Cheng 1937*25ec3e3dSEric Cheng for (i = 0; i < cnt; i++) 1938*25ec3e3dSEric Cheng types |= (uint32_t)vdp[i].vd_val; 1939*25ec3e3dSEric Cheng 1940*25ec3e3dSEric Cheng mrp->mrp_protect.mp_types = types; 1941*25ec3e3dSEric Cheng mrp->mrp_mask |= MRP_PROTECT; 1942*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1943*25ec3e3dSEric Cheng } 1944*25ec3e3dSEric Cheng 1945*25ec3e3dSEric Cheng dladm_status_t 1946*25ec3e3dSEric Cheng do_extract_allowedips(val_desc_t *vdp, uint_t cnt, void *arg) 1947*25ec3e3dSEric Cheng { 1948*25ec3e3dSEric Cheng mac_resource_props_t *mrp = arg; 1949*25ec3e3dSEric Cheng mac_protect_t *p = &mrp->mrp_protect; 1950*25ec3e3dSEric Cheng int i; 1951*25ec3e3dSEric Cheng 1952*25ec3e3dSEric Cheng if (vdp->vd_val == 0) { 1953*25ec3e3dSEric Cheng cnt = (uint_t)-1; 1954*25ec3e3dSEric Cheng } else { 1955*25ec3e3dSEric Cheng for (i = 0; i < cnt; i++) 1956*25ec3e3dSEric Cheng p->mp_ipaddrs[i] = (ipaddr_t)vdp[i].vd_val; 1957*25ec3e3dSEric Cheng } 1958*25ec3e3dSEric Cheng p->mp_ipaddrcnt = cnt; 1959*25ec3e3dSEric Cheng mrp->mrp_mask |= MRP_PROTECT; 1960*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1961*25ec3e3dSEric Cheng } 1962*25ec3e3dSEric Cheng 1963*25ec3e3dSEric Cheng /* ARGSUSED */ 1964*25ec3e3dSEric Cheng static dladm_status_t 1965*25ec3e3dSEric Cheng do_check_allowedips(dladm_handle_t handle, prop_desc_t *pdp, 1966*25ec3e3dSEric Cheng datalink_id_t linkid, char **prop_val, uint_t val_cnt, 1967*25ec3e3dSEric Cheng val_desc_t *vdp, datalink_media_t media) 1968*25ec3e3dSEric Cheng { 1969*25ec3e3dSEric Cheng dladm_status_t status; 1970*25ec3e3dSEric Cheng ipaddr_t addr; 1971*25ec3e3dSEric Cheng int i; 1972*25ec3e3dSEric Cheng 1973*25ec3e3dSEric Cheng if (val_cnt > MPT_MAXIPADDR) 1974*25ec3e3dSEric Cheng return (DLADM_STATUS_BADVALCNT); 1975*25ec3e3dSEric Cheng 1976*25ec3e3dSEric Cheng for (i = 0; i < val_cnt; i++) { 1977*25ec3e3dSEric Cheng status = dladm_str2ipv4addr(prop_val[i], &addr); 1978*25ec3e3dSEric Cheng if (status != DLADM_STATUS_OK) 1979*25ec3e3dSEric Cheng return (status); 1980*25ec3e3dSEric Cheng 1981*25ec3e3dSEric Cheng if (addr == 0) 1982*25ec3e3dSEric Cheng return (DLADM_STATUS_BADVAL); 1983*25ec3e3dSEric Cheng 1984*25ec3e3dSEric Cheng vdp[i].vd_val = (uintptr_t)addr; 1985*25ec3e3dSEric Cheng } 1986*25ec3e3dSEric Cheng return (DLADM_STATUS_OK); 1987*25ec3e3dSEric Cheng } 1988*25ec3e3dSEric Cheng 1989*25ec3e3dSEric Cheng /* ARGSUSED */ 1990*25ec3e3dSEric Cheng static dladm_status_t 19914ac67f02SAnurag S. Maskey do_get_autopush(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 1992da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 1993da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 1994d62bc4baSyz147064 { 19953bc21d0aSAruna Ramakrishna - Sun Microsystems struct dlautopush dlap; 19963bc21d0aSAruna Ramakrishna - Sun Microsystems int i, len; 19973bc21d0aSAruna Ramakrishna - Sun Microsystems dladm_status_t status; 19983bc21d0aSAruna Ramakrishna - Sun Microsystems dld_ioc_macprop_t *dip; 1999d62bc4baSyz147064 20003fd94f8cSam223141 if (flags & MAC_PROP_DEFAULT) 2001149b7eb2SSowmini Varadhan return (DLADM_STATUS_NOTDEFINED); 20024045d941Ssowmini 2003d62bc4baSyz147064 *val_cnt = 1; 20044ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2005da14cebeSEric Cheng &status, perm_flags); 20063bc21d0aSAruna Ramakrishna - Sun Microsystems if (dip == NULL) { 2007d62bc4baSyz147064 (*prop_val)[0] = '\0'; 2008da14cebeSEric Cheng return (DLADM_STATUS_OK); 2009d62bc4baSyz147064 } 20103bc21d0aSAruna Ramakrishna - Sun Microsystems (void) memcpy(&dlap, dip->pr_val, sizeof (dlap)); 2011d62bc4baSyz147064 20123bc21d0aSAruna Ramakrishna - Sun Microsystems for (i = 0, len = 0; i < dlap.dap_npush; i++) { 2013d62bc4baSyz147064 if (i != 0) { 2014d62bc4baSyz147064 (void) snprintf(*prop_val + len, 2015d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c", AP_DELIMITER); 2016d62bc4baSyz147064 len += 1; 2017d62bc4baSyz147064 } 2018d62bc4baSyz147064 (void) snprintf(*prop_val + len, DLADM_PROP_VAL_MAX - len, 20193bc21d0aSAruna Ramakrishna - Sun Microsystems "%s", dlap.dap_aplist[i]); 20203bc21d0aSAruna Ramakrishna - Sun Microsystems len += strlen(dlap.dap_aplist[i]); 20213bc21d0aSAruna Ramakrishna - Sun Microsystems if (dlap.dap_anchor - 1 == i) { 2022d62bc4baSyz147064 (void) snprintf(*prop_val + len, 2023d62bc4baSyz147064 DLADM_PROP_VAL_MAX - len, "%c%s", AP_DELIMITER, 2024d62bc4baSyz147064 AP_ANCHOR); 2025d62bc4baSyz147064 len += (strlen(AP_ANCHOR) + 1); 2026d62bc4baSyz147064 } 2027d62bc4baSyz147064 } 20283bc21d0aSAruna Ramakrishna - Sun Microsystems free(dip); 2029d62bc4baSyz147064 done: 2030d62bc4baSyz147064 return (DLADM_STATUS_OK); 2031d62bc4baSyz147064 } 2032d62bc4baSyz147064 2033d62bc4baSyz147064 /* 2034d62bc4baSyz147064 * Add the specified module to the dlautopush structure; returns a 2035d62bc4baSyz147064 * DLADM_STATUS_* code. 2036d62bc4baSyz147064 */ 2037d62bc4baSyz147064 dladm_status_t 2038d62bc4baSyz147064 i_dladm_add_ap_module(const char *module, struct dlautopush *dlap) 2039d62bc4baSyz147064 { 2040d62bc4baSyz147064 if ((strlen(module) == 0) || (strlen(module) > FMNAMESZ)) 2041d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 2042d62bc4baSyz147064 2043d62bc4baSyz147064 if (strncasecmp(module, AP_ANCHOR, strlen(AP_ANCHOR)) == 0) { 2044d62bc4baSyz147064 /* 2045d62bc4baSyz147064 * We don't allow multiple anchors, and the anchor must 2046d62bc4baSyz147064 * be after at least one module. 2047d62bc4baSyz147064 */ 2048d62bc4baSyz147064 if (dlap->dap_anchor != 0) 2049d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 2050d62bc4baSyz147064 if (dlap->dap_npush == 0) 2051d62bc4baSyz147064 return (DLADM_STATUS_BADVAL); 2052d62bc4baSyz147064 2053d62bc4baSyz147064 dlap->dap_anchor = dlap->dap_npush; 2054d62bc4baSyz147064 return (DLADM_STATUS_OK); 2055d62bc4baSyz147064 } 2056285e94f9SMichael Lim if (dlap->dap_npush >= MAXAPUSH) 2057d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2058d62bc4baSyz147064 2059d62bc4baSyz147064 (void) strlcpy(dlap->dap_aplist[dlap->dap_npush++], module, 2060d62bc4baSyz147064 FMNAMESZ + 1); 2061d62bc4baSyz147064 2062d62bc4baSyz147064 return (DLADM_STATUS_OK); 2063d62bc4baSyz147064 } 2064d62bc4baSyz147064 2065d62bc4baSyz147064 /* 2066d62bc4baSyz147064 * Currently, both '.' and ' '(space) can be used as the delimiters between 2067d62bc4baSyz147064 * autopush modules. The former is used in dladm set-linkprop, and the 2068d62bc4baSyz147064 * latter is used in the autopush(1M) file. 2069d62bc4baSyz147064 */ 2070d62bc4baSyz147064 /* ARGSUSED */ 2071d62bc4baSyz147064 static dladm_status_t 20724ac67f02SAnurag S. Maskey do_check_autopush(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 char *module; 2076d62bc4baSyz147064 struct dlautopush *dlap; 2077d62bc4baSyz147064 dladm_status_t status; 2078d62bc4baSyz147064 char val[DLADM_PROP_VAL_MAX]; 2079d62bc4baSyz147064 char delimiters[4]; 2080d62bc4baSyz147064 2081d62bc4baSyz147064 if (val_cnt != 1) 2082d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2083d62bc4baSyz147064 20843bc21d0aSAruna Ramakrishna - Sun Microsystems if (prop_val != NULL) { 2085d62bc4baSyz147064 dlap = malloc(sizeof (struct dlautopush)); 2086d62bc4baSyz147064 if (dlap == NULL) 2087d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 2088d62bc4baSyz147064 2089d62bc4baSyz147064 (void) memset(dlap, 0, sizeof (struct dlautopush)); 2090d62bc4baSyz147064 (void) snprintf(delimiters, 4, " %c\n", AP_DELIMITER); 2091d62bc4baSyz147064 bcopy(*prop_val, val, DLADM_PROP_VAL_MAX); 2092d62bc4baSyz147064 module = strtok(val, delimiters); 2093d62bc4baSyz147064 while (module != NULL) { 2094d62bc4baSyz147064 status = i_dladm_add_ap_module(module, dlap); 2095d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2096d62bc4baSyz147064 return (status); 2097d62bc4baSyz147064 module = strtok(NULL, delimiters); 2098d62bc4baSyz147064 } 2099d62bc4baSyz147064 2100d62bc4baSyz147064 vdp->vd_val = (uintptr_t)dlap; 21013bc21d0aSAruna Ramakrishna - Sun Microsystems } else { 21023bc21d0aSAruna Ramakrishna - Sun Microsystems vdp->vd_val = 0; 21033bc21d0aSAruna Ramakrishna - Sun Microsystems } 2104d62bc4baSyz147064 return (DLADM_STATUS_OK); 2105d62bc4baSyz147064 } 2106d62bc4baSyz147064 2107bcb5c89dSSowmini Varadhan #define WLDP_BUFSIZE (MAX_BUF_LEN - WIFI_BUF_OFFSET) 2108bcb5c89dSSowmini Varadhan 2109e7801d59Ssowmini /* ARGSUSED */ 2110d62bc4baSyz147064 static dladm_status_t 21114ac67f02SAnurag S. Maskey do_get_rate_common(dladm_handle_t handle, prop_desc_t *pdp, 21124ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, uint_t id, 21134ac67f02SAnurag S. Maskey uint_t *perm_flags) 2114d62bc4baSyz147064 { 2115d62bc4baSyz147064 wl_rates_t *wrp; 2116d62bc4baSyz147064 uint_t i; 2117d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2118d62bc4baSyz147064 2119bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 2120bcb5c89dSSowmini Varadhan if (wrp == NULL) 2121bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 2122d62bc4baSyz147064 21234ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, id, WLDP_BUFSIZE, 21244ac67f02SAnurag S. Maskey B_FALSE); 2125d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2126d62bc4baSyz147064 goto done; 2127d62bc4baSyz147064 2128d62bc4baSyz147064 if (wrp->wl_rates_num > *val_cnt) { 2129d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2130d62bc4baSyz147064 goto done; 2131d62bc4baSyz147064 } 2132d62bc4baSyz147064 2133d62bc4baSyz147064 if (wrp->wl_rates_rates[0] == 0) { 2134d62bc4baSyz147064 prop_val[0][0] = '\0'; 2135d62bc4baSyz147064 *val_cnt = 1; 2136d62bc4baSyz147064 goto done; 2137d62bc4baSyz147064 } 2138d62bc4baSyz147064 2139d62bc4baSyz147064 for (i = 0; i < wrp->wl_rates_num; i++) { 2140d62bc4baSyz147064 (void) snprintf(prop_val[i], DLADM_STRSIZE, "%.*f", 2141d62bc4baSyz147064 wrp->wl_rates_rates[i] % 2, 2142d62bc4baSyz147064 (float)wrp->wl_rates_rates[i] / 2); 2143d62bc4baSyz147064 } 2144d62bc4baSyz147064 *val_cnt = wrp->wl_rates_num; 2145da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_RW; 2146d62bc4baSyz147064 2147d62bc4baSyz147064 done: 2148bcb5c89dSSowmini Varadhan free(wrp); 2149d62bc4baSyz147064 return (status); 2150d62bc4baSyz147064 } 2151d62bc4baSyz147064 2152d62bc4baSyz147064 static dladm_status_t 21534ac67f02SAnurag S. Maskey do_get_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2154da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2155da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2156d62bc4baSyz147064 { 2157afdda45fSVasumathi Sundaram - Sun Microsystems if (media != DL_WIFI) { 21584ac67f02SAnurag S. Maskey return (i_dladm_speed_get(handle, pdp, linkid, prop_val, 2159da14cebeSEric Cheng val_cnt, flags, perm_flags)); 2160afdda45fSVasumathi Sundaram - Sun Microsystems } 21616b9e797cSsowmini 21624ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, val_cnt, 2163da14cebeSEric Cheng MAC_PROP_WL_DESIRED_RATES, perm_flags)); 2164d62bc4baSyz147064 } 2165d62bc4baSyz147064 21664045d941Ssowmini /* ARGSUSED */ 2167d62bc4baSyz147064 static dladm_status_t 21684ac67f02SAnurag S. Maskey do_get_rate_mod(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2169da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2170da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2171d62bc4baSyz147064 { 21726b9e797cSsowmini switch (media) { 21736b9e797cSsowmini case DL_ETHER: 21744045d941Ssowmini /* 21754045d941Ssowmini * Speed for ethernet links is unbounded. E.g., 802.11b 21764045d941Ssowmini * links can have a speed of 5.5 Gbps. 21774045d941Ssowmini */ 21784045d941Ssowmini return (DLADM_STATUS_NOTSUP); 21796b9e797cSsowmini 21806b9e797cSsowmini case DL_WIFI: 21814ac67f02SAnurag S. Maskey return (do_get_rate_common(handle, pdp, linkid, prop_val, 21824ac67f02SAnurag S. Maskey val_cnt, MAC_PROP_WL_SUPPORTED_RATES, perm_flags)); 21836b9e797cSsowmini default: 21846b9e797cSsowmini return (DLADM_STATUS_BADARG); 21856b9e797cSsowmini } 2186d62bc4baSyz147064 } 2187d62bc4baSyz147064 2188d62bc4baSyz147064 static dladm_status_t 21894ac67f02SAnurag S. Maskey do_set_rate(dladm_handle_t handle, datalink_id_t linkid, 21904ac67f02SAnurag S. Maskey dladm_wlan_rates_t *rates) 2191f4b3ec61Sdh155122 { 2192f4b3ec61Sdh155122 int i; 2193d62bc4baSyz147064 uint_t len; 2194d62bc4baSyz147064 wl_rates_t *wrp; 2195d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2196d62bc4baSyz147064 2197bcb5c89dSSowmini Varadhan wrp = malloc(WLDP_BUFSIZE); 2198bcb5c89dSSowmini Varadhan if (wrp == NULL) 2199d62bc4baSyz147064 return (DLADM_STATUS_NOMEM); 2200d62bc4baSyz147064 2201bcb5c89dSSowmini Varadhan bzero(wrp, WLDP_BUFSIZE); 2202d62bc4baSyz147064 for (i = 0; i < rates->wr_cnt; i++) 2203d62bc4baSyz147064 wrp->wl_rates_rates[i] = rates->wr_rates[i]; 2204d62bc4baSyz147064 wrp->wl_rates_num = rates->wr_cnt; 2205d62bc4baSyz147064 2206d62bc4baSyz147064 len = offsetof(wl_rates_t, wl_rates_rates) + 2207d62bc4baSyz147064 (rates->wr_cnt * sizeof (char)) + WIFI_BUF_OFFSET; 22084ac67f02SAnurag S. Maskey status = i_dladm_wlan_param(handle, linkid, wrp, 22094ac67f02SAnurag S. Maskey MAC_PROP_WL_DESIRED_RATES, len, B_TRUE); 2210d62bc4baSyz147064 2211bcb5c89dSSowmini Varadhan free(wrp); 2212d62bc4baSyz147064 return (status); 2213d62bc4baSyz147064 } 2214d62bc4baSyz147064 2215e7801d59Ssowmini /* ARGSUSED */ 2216d62bc4baSyz147064 static dladm_status_t 22174ac67f02SAnurag S. Maskey do_set_rate_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 22186b9e797cSsowmini val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 2219d62bc4baSyz147064 { 2220d62bc4baSyz147064 dladm_wlan_rates_t rates; 2221f4b3ec61Sdh155122 dladm_status_t status; 2222f4b3ec61Sdh155122 22236b9e797cSsowmini /* 22246b9e797cSsowmini * can currently set rate on WIFI links only. 22256b9e797cSsowmini */ 22266b9e797cSsowmini if (media != DL_WIFI) 22276b9e797cSsowmini return (DLADM_STATUS_PROPRDONLY); 22286b9e797cSsowmini 2229d62bc4baSyz147064 if (val_cnt != 1) 2230d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2231f4b3ec61Sdh155122 2232d62bc4baSyz147064 rates.wr_cnt = 1; 2233d62bc4baSyz147064 rates.wr_rates[0] = vdp[0].vd_val; 2234f4b3ec61Sdh155122 22354ac67f02SAnurag S. Maskey status = do_set_rate(handle, linkid, &rates); 2236f4b3ec61Sdh155122 2237d62bc4baSyz147064 done: 2238d62bc4baSyz147064 return (status); 2239d62bc4baSyz147064 } 2240d62bc4baSyz147064 2241d62bc4baSyz147064 /* ARGSUSED */ 2242d62bc4baSyz147064 static dladm_status_t 22434ac67f02SAnurag S. Maskey do_check_rate(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 22444ac67f02SAnurag S. Maskey char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 2245d62bc4baSyz147064 { 2246d62bc4baSyz147064 int i; 2247d62bc4baSyz147064 uint_t modval_cnt = MAX_SUPPORT_RATES; 2248d62bc4baSyz147064 char *buf, **modval; 2249d62bc4baSyz147064 dladm_status_t status; 2250afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 2251d62bc4baSyz147064 2252d62bc4baSyz147064 if (val_cnt != 1) 2253d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2254d62bc4baSyz147064 2255d62bc4baSyz147064 buf = malloc((sizeof (char *) + DLADM_STRSIZE) * 2256d62bc4baSyz147064 MAX_SUPPORT_RATES); 2257d62bc4baSyz147064 if (buf == NULL) { 2258d62bc4baSyz147064 status = DLADM_STATUS_NOMEM; 2259d62bc4baSyz147064 goto done; 2260d62bc4baSyz147064 } 2261d62bc4baSyz147064 2262d62bc4baSyz147064 modval = (char **)(void *)buf; 2263d62bc4baSyz147064 for (i = 0; i < MAX_SUPPORT_RATES; i++) { 2264d62bc4baSyz147064 modval[i] = buf + sizeof (char *) * MAX_SUPPORT_RATES + 2265d62bc4baSyz147064 i * DLADM_STRSIZE; 2266d62bc4baSyz147064 } 2267d62bc4baSyz147064 22684ac67f02SAnurag S. Maskey status = do_get_rate_mod(handle, NULL, linkid, modval, &modval_cnt, 22694ac67f02SAnurag S. Maskey media, 0, &perm_flags); 2270d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2271d62bc4baSyz147064 goto done; 2272d62bc4baSyz147064 2273d62bc4baSyz147064 for (i = 0; i < modval_cnt; i++) { 2274d62bc4baSyz147064 if (strcasecmp(*prop_val, modval[i]) == 0) { 2275e7801d59Ssowmini vdp->vd_val = (uintptr_t)(uint_t) 2276e7801d59Ssowmini (atof(*prop_val) * 2); 2277f4b3ec61Sdh155122 status = DLADM_STATUS_OK; 2278f4b3ec61Sdh155122 break; 2279f4b3ec61Sdh155122 } 2280d62bc4baSyz147064 } 2281d62bc4baSyz147064 if (i == modval_cnt) 2282d62bc4baSyz147064 status = DLADM_STATUS_BADVAL; 2283d62bc4baSyz147064 done: 2284d62bc4baSyz147064 free(buf); 2285d62bc4baSyz147064 return (status); 2286d62bc4baSyz147064 } 2287f4b3ec61Sdh155122 2288d62bc4baSyz147064 static dladm_status_t 22894ac67f02SAnurag S. Maskey do_get_phyconf(dladm_handle_t handle, datalink_id_t linkid, void *buf, 22904ac67f02SAnurag S. Maskey int buflen) 2291d62bc4baSyz147064 { 22924ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_PHY_CONFIG, 2293bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2294d62bc4baSyz147064 } 2295d62bc4baSyz147064 2296e7801d59Ssowmini /* ARGSUSED */ 2297d62bc4baSyz147064 static dladm_status_t 22984ac67f02SAnurag S. Maskey do_get_channel_prop(dladm_handle_t handle, prop_desc_t *pdp, 22994ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 23004ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2301d62bc4baSyz147064 { 2302d62bc4baSyz147064 uint32_t channel; 2303bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2304d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2305bcb5c89dSSowmini Varadhan wl_phy_conf_t wl_phy_conf; 2306d62bc4baSyz147064 23074ac67f02SAnurag S. Maskey if ((status = do_get_phyconf(handle, linkid, buf, sizeof (buf))) 2308bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2309d62bc4baSyz147064 goto done; 2310d62bc4baSyz147064 2311bcb5c89dSSowmini Varadhan (void) memcpy(&wl_phy_conf, buf, sizeof (wl_phy_conf)); 2312bcb5c89dSSowmini Varadhan if (!i_dladm_wlan_convert_chan(&wl_phy_conf, &channel)) { 2313d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2314d62bc4baSyz147064 goto done; 2315d62bc4baSyz147064 } 2316d62bc4baSyz147064 2317d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%u", channel); 2318d62bc4baSyz147064 *val_cnt = 1; 2319da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2320d62bc4baSyz147064 done: 2321d62bc4baSyz147064 return (status); 2322d62bc4baSyz147064 } 2323d62bc4baSyz147064 2324d62bc4baSyz147064 static dladm_status_t 23254ac67f02SAnurag S. Maskey do_get_powermode(dladm_handle_t handle, datalink_id_t linkid, void *buf, 23264ac67f02SAnurag S. Maskey int buflen) 2327d62bc4baSyz147064 { 23284ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_POWER_MODE, 2329bcb5c89dSSowmini Varadhan buflen, B_FALSE)); 2330d62bc4baSyz147064 } 2331d62bc4baSyz147064 2332e7801d59Ssowmini /* ARGSUSED */ 2333d62bc4baSyz147064 static dladm_status_t 23344ac67f02SAnurag S. Maskey do_get_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 23354ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 23364ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2337d62bc4baSyz147064 { 2338bcb5c89dSSowmini Varadhan wl_ps_mode_t mode; 2339d62bc4baSyz147064 const char *s; 2340bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2341d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2342d62bc4baSyz147064 23434ac67f02SAnurag S. Maskey if ((status = do_get_powermode(handle, linkid, buf, sizeof (buf))) 2344bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2345d62bc4baSyz147064 goto done; 2346d62bc4baSyz147064 2347bcb5c89dSSowmini Varadhan (void) memcpy(&mode, buf, sizeof (mode)); 2348bcb5c89dSSowmini Varadhan switch (mode.wl_ps_mode) { 2349d62bc4baSyz147064 case WL_PM_AM: 2350d62bc4baSyz147064 s = "off"; 2351f4b3ec61Sdh155122 break; 2352d62bc4baSyz147064 case WL_PM_MPS: 2353d62bc4baSyz147064 s = "max"; 2354d62bc4baSyz147064 break; 2355d62bc4baSyz147064 case WL_PM_FAST: 2356d62bc4baSyz147064 s = "fast"; 2357f4b3ec61Sdh155122 break; 2358f4b3ec61Sdh155122 default: 2359d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2360d62bc4baSyz147064 goto done; 2361f4b3ec61Sdh155122 } 2362d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2363d62bc4baSyz147064 *val_cnt = 1; 2364afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2365da14cebeSEric Cheng done: 2366d62bc4baSyz147064 return (status); 2367d62bc4baSyz147064 } 2368d62bc4baSyz147064 2369d62bc4baSyz147064 static dladm_status_t 23704ac67f02SAnurag S. Maskey do_set_powermode(dladm_handle_t handle, datalink_id_t linkid, 23714ac67f02SAnurag S. Maskey dladm_wlan_powermode_t *pm) 2372d62bc4baSyz147064 { 2373d62bc4baSyz147064 wl_ps_mode_t ps_mode; 2374d62bc4baSyz147064 2375d62bc4baSyz147064 (void) memset(&ps_mode, 0xff, sizeof (ps_mode)); 2376d62bc4baSyz147064 2377d62bc4baSyz147064 switch (*pm) { 2378d62bc4baSyz147064 case DLADM_WLAN_PM_OFF: 2379d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_AM; 2380d62bc4baSyz147064 break; 2381d62bc4baSyz147064 case DLADM_WLAN_PM_MAX: 2382d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_MPS; 2383d62bc4baSyz147064 break; 2384d62bc4baSyz147064 case DLADM_WLAN_PM_FAST: 2385d62bc4baSyz147064 ps_mode.wl_ps_mode = WL_PM_FAST; 2386d62bc4baSyz147064 break; 2387d62bc4baSyz147064 default: 2388d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2389d62bc4baSyz147064 } 23904ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &ps_mode, 23914ac67f02SAnurag S. Maskey MAC_PROP_WL_POWER_MODE, sizeof (ps_mode), B_TRUE)); 2392d62bc4baSyz147064 } 2393d62bc4baSyz147064 2394d62bc4baSyz147064 /* ARGSUSED */ 2395d62bc4baSyz147064 static dladm_status_t 23964ac67f02SAnurag S. Maskey do_set_powermode_prop(dladm_handle_t handle, prop_desc_t *pdp, 23974ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 23984ac67f02SAnurag S. Maskey datalink_media_t media) 2399d62bc4baSyz147064 { 2400d62bc4baSyz147064 dladm_wlan_powermode_t powermode = (dladm_wlan_powermode_t)vdp->vd_val; 2401d62bc4baSyz147064 dladm_status_t status; 2402d62bc4baSyz147064 2403d62bc4baSyz147064 if (val_cnt != 1) 2404d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2405d62bc4baSyz147064 24064ac67f02SAnurag S. Maskey status = do_set_powermode(handle, linkid, &powermode); 2407f4b3ec61Sdh155122 2408f4b3ec61Sdh155122 return (status); 2409f4b3ec61Sdh155122 } 2410f4b3ec61Sdh155122 2411f4b3ec61Sdh155122 static dladm_status_t 24124ac67f02SAnurag S. Maskey do_get_radio(dladm_handle_t handle, datalink_id_t linkid, void *buf, int buflen) 2413f4b3ec61Sdh155122 { 24144ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, buf, MAC_PROP_WL_RADIO, 24154ac67f02SAnurag S. Maskey buflen, B_FALSE)); 2416d62bc4baSyz147064 } 2417d62bc4baSyz147064 2418e7801d59Ssowmini /* ARGSUSED */ 2419d62bc4baSyz147064 static dladm_status_t 24204ac67f02SAnurag S. Maskey do_get_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2421da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, datalink_media_t media, 2422da14cebeSEric Cheng uint_t flags, uint_t *perm_flags) 2423d62bc4baSyz147064 { 2424d62bc4baSyz147064 wl_radio_t radio; 2425d62bc4baSyz147064 const char *s; 2426bcb5c89dSSowmini Varadhan char buf[WLDP_BUFSIZE]; 2427d62bc4baSyz147064 dladm_status_t status = DLADM_STATUS_OK; 2428d62bc4baSyz147064 24294ac67f02SAnurag S. Maskey if ((status = do_get_radio(handle, linkid, buf, sizeof (buf))) 2430bcb5c89dSSowmini Varadhan != DLADM_STATUS_OK) 2431d62bc4baSyz147064 goto done; 2432d62bc4baSyz147064 2433bcb5c89dSSowmini Varadhan (void) memcpy(&radio, buf, sizeof (radio)); 2434d62bc4baSyz147064 switch (radio) { 2435d62bc4baSyz147064 case B_TRUE: 2436d62bc4baSyz147064 s = "on"; 2437d62bc4baSyz147064 break; 2438d62bc4baSyz147064 case B_FALSE: 2439d62bc4baSyz147064 s = "off"; 2440d62bc4baSyz147064 break; 2441d62bc4baSyz147064 default: 2442d62bc4baSyz147064 status = DLADM_STATUS_NOTFOUND; 2443d62bc4baSyz147064 goto done; 2444d62bc4baSyz147064 } 2445d62bc4baSyz147064 (void) snprintf(*prop_val, DLADM_STRSIZE, "%s", s); 2446d62bc4baSyz147064 *val_cnt = 1; 2447afdda45fSVasumathi Sundaram - Sun Microsystems *perm_flags = MAC_PROP_PERM_RW; 2448da14cebeSEric Cheng done: 2449d62bc4baSyz147064 return (status); 2450d62bc4baSyz147064 } 2451d62bc4baSyz147064 2452d62bc4baSyz147064 static dladm_status_t 24534ac67f02SAnurag S. Maskey do_set_radio(dladm_handle_t handle, datalink_id_t linkid, 24544ac67f02SAnurag S. Maskey dladm_wlan_radio_t *radio) 2455d62bc4baSyz147064 { 2456d62bc4baSyz147064 wl_radio_t r; 2457d62bc4baSyz147064 2458d62bc4baSyz147064 switch (*radio) { 2459d62bc4baSyz147064 case DLADM_WLAN_RADIO_ON: 2460d62bc4baSyz147064 r = B_TRUE; 2461d62bc4baSyz147064 break; 2462d62bc4baSyz147064 case DLADM_WLAN_RADIO_OFF: 2463d62bc4baSyz147064 r = B_FALSE; 2464d62bc4baSyz147064 break; 2465d62bc4baSyz147064 default: 2466d62bc4baSyz147064 return (DLADM_STATUS_NOTSUP); 2467d62bc4baSyz147064 } 24684ac67f02SAnurag S. Maskey return (i_dladm_wlan_param(handle, linkid, &r, MAC_PROP_WL_RADIO, 2469bcb5c89dSSowmini Varadhan sizeof (r), B_TRUE)); 2470d62bc4baSyz147064 } 2471d62bc4baSyz147064 2472d62bc4baSyz147064 /* ARGSUSED */ 2473d62bc4baSyz147064 static dladm_status_t 24744ac67f02SAnurag S. Maskey do_set_radio_prop(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 24752b24ab6bSSebastien Roy val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 2476d62bc4baSyz147064 { 2477d62bc4baSyz147064 dladm_wlan_radio_t radio = (dladm_wlan_radio_t)vdp->vd_val; 2478f4b3ec61Sdh155122 dladm_status_t status; 2479f4b3ec61Sdh155122 2480d62bc4baSyz147064 if (val_cnt != 1) 2481d62bc4baSyz147064 return (DLADM_STATUS_BADVALCNT); 2482f4b3ec61Sdh155122 24834ac67f02SAnurag S. Maskey status = do_set_radio(handle, linkid, &radio); 2484f4b3ec61Sdh155122 2485d62bc4baSyz147064 return (status); 2486d62bc4baSyz147064 } 2487f4b3ec61Sdh155122 24882b24ab6bSSebastien Roy /* ARGSUSED */ 24892b24ab6bSSebastien Roy static dladm_status_t 24902b24ab6bSSebastien Roy do_check_hoplimit(dladm_handle_t handle, prop_desc_t *pdp, 24912b24ab6bSSebastien Roy datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 24922b24ab6bSSebastien Roy datalink_media_t media) 24932b24ab6bSSebastien Roy { 24942b24ab6bSSebastien Roy int32_t hlim; 24952b24ab6bSSebastien Roy char *ep; 24962b24ab6bSSebastien Roy 24972b24ab6bSSebastien Roy if (val_cnt != 1) 24982b24ab6bSSebastien Roy return (DLADM_STATUS_BADVALCNT); 24992b24ab6bSSebastien Roy 25002b24ab6bSSebastien Roy errno = 0; 25012b24ab6bSSebastien Roy hlim = strtol(*prop_val, &ep, 10); 25022b24ab6bSSebastien Roy if (errno != 0 || ep == *prop_val || hlim < 1 || 25032b24ab6bSSebastien Roy hlim > (int32_t)UINT8_MAX) 25042b24ab6bSSebastien Roy return (DLADM_STATUS_BADVAL); 25052b24ab6bSSebastien Roy vdp->vd_val = hlim; 25062b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 25072b24ab6bSSebastien Roy } 25082b24ab6bSSebastien Roy 25092b24ab6bSSebastien Roy /* ARGSUSED */ 25102b24ab6bSSebastien Roy static dladm_status_t 25112b24ab6bSSebastien Roy do_check_encaplim(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 25122b24ab6bSSebastien Roy char **prop_val, uint_t val_cnt, val_desc_t *vdp, datalink_media_t media) 25132b24ab6bSSebastien Roy { 25142b24ab6bSSebastien Roy int32_t elim; 25152b24ab6bSSebastien Roy char *ep; 25162b24ab6bSSebastien Roy 25172b24ab6bSSebastien Roy if (media != DL_IPV6) 25182b24ab6bSSebastien Roy return (DLADM_STATUS_BADARG); 25192b24ab6bSSebastien Roy 25202b24ab6bSSebastien Roy if (val_cnt != 1) 25212b24ab6bSSebastien Roy return (DLADM_STATUS_BADVALCNT); 25222b24ab6bSSebastien Roy 25232b24ab6bSSebastien Roy errno = 0; 25242b24ab6bSSebastien Roy elim = strtol(*prop_val, &ep, 10); 25252b24ab6bSSebastien Roy if (errno != 0 || ep == *prop_val || elim < 0 || 25262b24ab6bSSebastien Roy elim > (int32_t)UINT8_MAX) 25272b24ab6bSSebastien Roy return (DLADM_STATUS_BADVAL); 25282b24ab6bSSebastien Roy vdp->vd_val = elim; 25292b24ab6bSSebastien Roy return (DLADM_STATUS_OK); 25302b24ab6bSSebastien Roy } 25312b24ab6bSSebastien Roy 2532d62bc4baSyz147064 static dladm_status_t 25334ac67f02SAnurag S. Maskey i_dladm_set_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 25344ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt) 2535d62bc4baSyz147064 { 2536d62bc4baSyz147064 char buf[MAXLINELEN]; 2537d62bc4baSyz147064 int i; 2538d62bc4baSyz147064 dladm_conf_t conf; 2539d62bc4baSyz147064 dladm_status_t status; 2540d62bc4baSyz147064 25414ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2542f4b3ec61Sdh155122 if (status != DLADM_STATUS_OK) 2543f4b3ec61Sdh155122 return (status); 2544f4b3ec61Sdh155122 2545d62bc4baSyz147064 /* 2546d62bc4baSyz147064 * reset case. 2547d62bc4baSyz147064 */ 2548d62bc4baSyz147064 if (val_cnt == 0) { 25494ac67f02SAnurag S. Maskey status = dladm_unset_conf_field(handle, conf, prop_name); 2550d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 25514ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2552d62bc4baSyz147064 goto done; 2553f4b3ec61Sdh155122 } 2554f4b3ec61Sdh155122 2555d62bc4baSyz147064 buf[0] = '\0'; 2556d62bc4baSyz147064 for (i = 0; i < val_cnt; i++) { 2557d62bc4baSyz147064 (void) strlcat(buf, prop_val[i], MAXLINELEN); 2558d62bc4baSyz147064 if (i != val_cnt - 1) 2559d62bc4baSyz147064 (void) strlcat(buf, ",", MAXLINELEN); 2560d62bc4baSyz147064 } 2561f4b3ec61Sdh155122 25624ac67f02SAnurag S. Maskey status = dladm_set_conf_field(handle, conf, prop_name, DLADM_TYPE_STR, 25634ac67f02SAnurag S. Maskey buf); 2564d62bc4baSyz147064 if (status == DLADM_STATUS_OK) 25654ac67f02SAnurag S. Maskey status = dladm_write_conf(handle, conf); 2566d62bc4baSyz147064 2567d62bc4baSyz147064 done: 25684ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2569f4b3ec61Sdh155122 return (status); 2570f4b3ec61Sdh155122 } 2571f4b3ec61Sdh155122 2572f4b3ec61Sdh155122 static dladm_status_t 25734ac67f02SAnurag S. Maskey i_dladm_get_linkprop_db(dladm_handle_t handle, datalink_id_t linkid, 25744ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cntp) 2575f4b3ec61Sdh155122 { 2576d62bc4baSyz147064 char buf[MAXLINELEN], *str; 2577d62bc4baSyz147064 uint_t cnt = 0; 2578d62bc4baSyz147064 dladm_conf_t conf; 2579d62bc4baSyz147064 dladm_status_t status; 2580f4b3ec61Sdh155122 25814ac67f02SAnurag S. Maskey status = dladm_read_conf(handle, linkid, &conf); 2582d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2583f4b3ec61Sdh155122 return (status); 2584d62bc4baSyz147064 25854ac67f02SAnurag S. Maskey status = dladm_get_conf_field(handle, conf, prop_name, buf, MAXLINELEN); 2586d62bc4baSyz147064 if (status != DLADM_STATUS_OK) 2587d62bc4baSyz147064 goto done; 2588d62bc4baSyz147064 2589d62bc4baSyz147064 str = strtok(buf, ","); 2590d62bc4baSyz147064 while (str != NULL) { 2591d62bc4baSyz147064 if (cnt == *val_cntp) { 2592d62bc4baSyz147064 status = DLADM_STATUS_TOOSMALL; 2593d62bc4baSyz147064 goto done; 2594d62bc4baSyz147064 } 2595d62bc4baSyz147064 (void) strlcpy(prop_val[cnt++], str, DLADM_PROP_VAL_MAX); 2596d62bc4baSyz147064 str = strtok(NULL, ","); 2597f4b3ec61Sdh155122 } 2598f4b3ec61Sdh155122 2599d62bc4baSyz147064 *val_cntp = cnt; 2600f4b3ec61Sdh155122 2601d62bc4baSyz147064 done: 26024ac67f02SAnurag S. Maskey dladm_destroy_conf(handle, conf); 2603d62bc4baSyz147064 return (status); 2604f4b3ec61Sdh155122 } 2605e7801d59Ssowmini 260662ee1d25SArtem Kachitchkine /* 260762ee1d25SArtem Kachitchkine * Walk persistent private link properties of a link. 260862ee1d25SArtem Kachitchkine */ 260962ee1d25SArtem Kachitchkine static dladm_status_t 261062ee1d25SArtem Kachitchkine i_dladm_walk_linkprop_priv_db(dladm_handle_t handle, datalink_id_t linkid, 261162ee1d25SArtem Kachitchkine void *arg, int (*func)(dladm_handle_t, datalink_id_t, const char *, void *)) 261262ee1d25SArtem Kachitchkine { 261362ee1d25SArtem Kachitchkine dladm_status_t status; 261462ee1d25SArtem Kachitchkine dladm_conf_t conf; 261562ee1d25SArtem Kachitchkine char last_attr[MAXLINKATTRLEN]; 261662ee1d25SArtem Kachitchkine char attr[MAXLINKATTRLEN]; 261762ee1d25SArtem Kachitchkine char attrval[MAXLINKATTRVALLEN]; 261862ee1d25SArtem Kachitchkine size_t attrsz; 261962ee1d25SArtem Kachitchkine 262062ee1d25SArtem Kachitchkine if (linkid == DATALINK_INVALID_LINKID || func == NULL) 262162ee1d25SArtem Kachitchkine return (DLADM_STATUS_BADARG); 262262ee1d25SArtem Kachitchkine 262362ee1d25SArtem Kachitchkine status = dladm_read_conf(handle, linkid, &conf); 262462ee1d25SArtem Kachitchkine if (status != DLADM_STATUS_OK) 262562ee1d25SArtem Kachitchkine return (status); 262662ee1d25SArtem Kachitchkine 262762ee1d25SArtem Kachitchkine last_attr[0] = '\0'; 262862ee1d25SArtem Kachitchkine while ((status = dladm_getnext_conf_linkprop(handle, conf, last_attr, 262962ee1d25SArtem Kachitchkine attr, attrval, MAXLINKATTRVALLEN, &attrsz)) == DLADM_STATUS_OK) { 263062ee1d25SArtem Kachitchkine if (attr[0] == '_') { 263162ee1d25SArtem Kachitchkine if (func(handle, linkid, attr, arg) == 263262ee1d25SArtem Kachitchkine DLADM_WALK_TERMINATE) 263362ee1d25SArtem Kachitchkine break; 263462ee1d25SArtem Kachitchkine } 263562ee1d25SArtem Kachitchkine (void) strlcpy(last_attr, attr, MAXLINKATTRLEN); 263662ee1d25SArtem Kachitchkine } 263762ee1d25SArtem Kachitchkine 263862ee1d25SArtem Kachitchkine dladm_destroy_conf(handle, conf); 263962ee1d25SArtem Kachitchkine return (DLADM_STATUS_OK); 264062ee1d25SArtem Kachitchkine } 264162ee1d25SArtem Kachitchkine 2642bcb5c89dSSowmini Varadhan static link_attr_t * 2643e7801d59Ssowmini dladm_name2prop(const char *prop_name) 2644e7801d59Ssowmini { 2645bcb5c89dSSowmini Varadhan link_attr_t *p; 2646e7801d59Ssowmini 2647bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2648e7801d59Ssowmini if (strcmp(p->pp_name, prop_name) == 0) 2649e7801d59Ssowmini break; 2650e7801d59Ssowmini } 2651e7801d59Ssowmini return (p); 2652e7801d59Ssowmini } 2653e7801d59Ssowmini 2654bcb5c89dSSowmini Varadhan static link_attr_t * 2655bcb5c89dSSowmini Varadhan dladm_id2prop(mac_prop_id_t propid) 2656bcb5c89dSSowmini Varadhan { 2657bcb5c89dSSowmini Varadhan link_attr_t *p; 2658bcb5c89dSSowmini Varadhan 2659bcb5c89dSSowmini Varadhan for (p = link_attr; p->pp_id != MAC_PROP_PRIVATE; p++) { 2660bcb5c89dSSowmini Varadhan if (p->pp_id == propid) 2661bcb5c89dSSowmini Varadhan break; 2662bcb5c89dSSowmini Varadhan } 2663bcb5c89dSSowmini Varadhan return (p); 2664bcb5c89dSSowmini Varadhan } 2665e7801d59Ssowmini 26663fd94f8cSam223141 static dld_ioc_macprop_t * 2667bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_impl(size_t valsize, datalink_id_t linkid, 2668bcb5c89dSSowmini Varadhan const char *prop_name, mac_prop_id_t propid, uint_t flags, 2669bcb5c89dSSowmini Varadhan dladm_status_t *status) 2670e7801d59Ssowmini { 2671e7801d59Ssowmini int dsize; 26723fd94f8cSam223141 dld_ioc_macprop_t *dip; 2673e7801d59Ssowmini 2674e7801d59Ssowmini *status = DLADM_STATUS_OK; 26753fd94f8cSam223141 dsize = MAC_PROP_BUFSIZE(valsize); 2676e7801d59Ssowmini dip = malloc(dsize); 2677e7801d59Ssowmini if (dip == NULL) { 2678e7801d59Ssowmini *status = DLADM_STATUS_NOMEM; 2679e7801d59Ssowmini return (NULL); 2680e7801d59Ssowmini } 2681e7801d59Ssowmini bzero(dip, dsize); 2682e7801d59Ssowmini dip->pr_valsize = valsize; 26834045d941Ssowmini (void) strlcpy(dip->pr_name, prop_name, sizeof (dip->pr_name)); 26843fd94f8cSam223141 dip->pr_version = MAC_PROP_VERSION; 26856b9e797cSsowmini dip->pr_linkid = linkid; 2686bcb5c89dSSowmini Varadhan dip->pr_num = propid; 26874045d941Ssowmini dip->pr_flags = flags; 2688e7801d59Ssowmini return (dip); 2689e7801d59Ssowmini } 2690e7801d59Ssowmini 2691bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2692bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_name(size_t valsize, datalink_id_t linkid, 2693bcb5c89dSSowmini Varadhan const char *prop_name, uint_t flags, dladm_status_t *status) 2694bcb5c89dSSowmini Varadhan { 2695bcb5c89dSSowmini Varadhan link_attr_t *p; 2696bcb5c89dSSowmini Varadhan 2697bcb5c89dSSowmini Varadhan p = dladm_name2prop(prop_name); 2698bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2699bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, prop_name, p->pp_id, 2700bcb5c89dSSowmini Varadhan flags, status)); 2701bcb5c89dSSowmini Varadhan } 2702bcb5c89dSSowmini Varadhan 2703bcb5c89dSSowmini Varadhan static dld_ioc_macprop_t * 2704bcb5c89dSSowmini Varadhan i_dladm_buf_alloc_by_id(size_t valsize, datalink_id_t linkid, 2705bcb5c89dSSowmini Varadhan mac_prop_id_t propid, uint_t flags, dladm_status_t *status) 2706bcb5c89dSSowmini Varadhan { 2707bcb5c89dSSowmini Varadhan link_attr_t *p; 2708bcb5c89dSSowmini Varadhan 2709bcb5c89dSSowmini Varadhan p = dladm_id2prop(propid); 2710bcb5c89dSSowmini Varadhan valsize = MAX(p->pp_valsize, valsize); 2711bcb5c89dSSowmini Varadhan return (i_dladm_buf_alloc_impl(valsize, linkid, p->pp_name, propid, 2712bcb5c89dSSowmini Varadhan flags, status)); 2713bcb5c89dSSowmini Varadhan } 2714bcb5c89dSSowmini Varadhan 2715e7801d59Ssowmini /* ARGSUSED */ 2716e7801d59Ssowmini static dladm_status_t 27174ac67f02SAnurag S. Maskey i_dladm_set_public_prop(dladm_handle_t handle, prop_desc_t *pdp, 27184ac67f02SAnurag S. Maskey datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, 27194ac67f02SAnurag S. Maskey datalink_media_t media) 2720e7801d59Ssowmini { 27213fd94f8cSam223141 dld_ioc_macprop_t *dip; 2722e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 2723e7801d59Ssowmini uint8_t u8; 2724e7801d59Ssowmini uint16_t u16; 2725e7801d59Ssowmini uint32_t u32; 2726e7801d59Ssowmini void *val; 2727e7801d59Ssowmini 2728da14cebeSEric Cheng dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, 0, &status); 2729e7801d59Ssowmini if (dip == NULL) 2730e7801d59Ssowmini return (status); 2731e7801d59Ssowmini 2732da14cebeSEric Cheng if (pdp->pd_flags & PD_CHECK_ALLOC) 2733e7801d59Ssowmini val = (void *)vdp->vd_val; 2734e7801d59Ssowmini else { 2735e7801d59Ssowmini /* 2736e7801d59Ssowmini * Currently all 1/2/4-byte size properties are byte/word/int. 2737e7801d59Ssowmini * No need (yet) to distinguish these from arrays of same size. 2738e7801d59Ssowmini */ 2739e7801d59Ssowmini switch (dip->pr_valsize) { 2740e7801d59Ssowmini case 1: 2741e7801d59Ssowmini u8 = vdp->vd_val; 2742e7801d59Ssowmini val = &u8; 2743e7801d59Ssowmini break; 2744e7801d59Ssowmini case 2: 2745e7801d59Ssowmini u16 = vdp->vd_val; 2746e7801d59Ssowmini val = &u16; 2747e7801d59Ssowmini break; 2748e7801d59Ssowmini case 4: 2749e7801d59Ssowmini u32 = vdp->vd_val; 2750e7801d59Ssowmini val = &u32; 2751e7801d59Ssowmini break; 2752e7801d59Ssowmini default: 2753e7801d59Ssowmini val = &vdp->vd_val; 2754e7801d59Ssowmini break; 2755e7801d59Ssowmini } 2756e7801d59Ssowmini } 2757e7801d59Ssowmini 27583bc21d0aSAruna Ramakrishna - Sun Microsystems if (val != NULL) 2759e7801d59Ssowmini (void) memcpy(dip->pr_val, val, dip->pr_valsize); 27603bc21d0aSAruna Ramakrishna - Sun Microsystems else 27613bc21d0aSAruna Ramakrishna - Sun Microsystems dip->pr_valsize = 0; 27623bc21d0aSAruna Ramakrishna - Sun Microsystems 27634ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_TRUE); 2764bcb5c89dSSowmini Varadhan 2765bcb5c89dSSowmini Varadhan done: 2766bcb5c89dSSowmini Varadhan free(dip); 2767bcb5c89dSSowmini Varadhan return (status); 2768bcb5c89dSSowmini Varadhan } 2769bcb5c89dSSowmini Varadhan 2770bcb5c89dSSowmini Varadhan dladm_status_t 27714ac67f02SAnurag S. Maskey i_dladm_macprop(dladm_handle_t handle, void *dip, boolean_t set) 2772bcb5c89dSSowmini Varadhan { 2773bcb5c89dSSowmini Varadhan dladm_status_t status = DLADM_STATUS_OK; 2774bcb5c89dSSowmini Varadhan 27754ac67f02SAnurag S. Maskey if (ioctl(dladm_dld_fd(handle), 27764ac67f02SAnurag S. Maskey (set ? DLDIOC_SETMACPROP : DLDIOC_GETMACPROP), dip)) 2777e7801d59Ssowmini status = dladm_errno2status(errno); 2778e7801d59Ssowmini 2779e7801d59Ssowmini return (status); 2780e7801d59Ssowmini } 2781e7801d59Ssowmini 27823fd94f8cSam223141 static dld_ioc_macprop_t * 27834ac67f02SAnurag S. Maskey i_dladm_get_public_prop(dladm_handle_t handle, datalink_id_t linkid, 27844ac67f02SAnurag S. Maskey char *prop_name, uint_t flags, dladm_status_t *status, uint_t *perm_flags) 2785e7801d59Ssowmini { 27863fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 27874045d941Ssowmini 2788bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(0, linkid, prop_name, flags, status); 27894045d941Ssowmini if (dip == NULL) 27904045d941Ssowmini return (NULL); 2791e7801d59Ssowmini 27924ac67f02SAnurag S. Maskey *status = i_dladm_macprop(handle, dip, B_FALSE); 27934045d941Ssowmini if (*status != DLADM_STATUS_OK) { 27944045d941Ssowmini free(dip); 27954045d941Ssowmini return (NULL); 27964045d941Ssowmini } 2797da14cebeSEric Cheng if (perm_flags != NULL) 2798da14cebeSEric Cheng *perm_flags = dip->pr_perm_flags; 2799da14cebeSEric Cheng 28004045d941Ssowmini return (dip); 2801e7801d59Ssowmini } 2802e7801d59Ssowmini 2803e7801d59Ssowmini /* ARGSUSED */ 2804e7801d59Ssowmini static dladm_status_t 28054eaa4710SRishi Srivatsavai i_dladm_uint32_check(dladm_handle_t handle, prop_desc_t *pdp, 28064ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *v, 28074ac67f02SAnurag S. Maskey datalink_media_t media) 2808e7801d59Ssowmini { 2809e7801d59Ssowmini if (val_cnt != 1) 2810e7801d59Ssowmini return (DLADM_STATUS_BADVAL); 28114eaa4710SRishi Srivatsavai v->vd_val = strtoul(prop_val[0], NULL, 0); 2812e7801d59Ssowmini return (DLADM_STATUS_OK); 2813e7801d59Ssowmini } 2814e7801d59Ssowmini 2815e7801d59Ssowmini /* ARGSUSED */ 2816e7801d59Ssowmini static dladm_status_t 28174ac67f02SAnurag S. Maskey i_dladm_duplex_get(dladm_handle_t handle, prop_desc_t *pdp, 28184ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 28194ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2820e7801d59Ssowmini { 2821e7801d59Ssowmini link_duplex_t link_duplex; 2822e7801d59Ssowmini dladm_status_t status; 2823e7801d59Ssowmini 28244ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "link_duplex", 2825e7801d59Ssowmini KSTAT_DATA_UINT32, &link_duplex)) != 0) 2826e7801d59Ssowmini return (status); 2827e7801d59Ssowmini 2828e7801d59Ssowmini switch (link_duplex) { 2829e7801d59Ssowmini case LINK_DUPLEX_FULL: 2830e7801d59Ssowmini (void) strcpy(*prop_val, "full"); 2831e7801d59Ssowmini break; 2832e7801d59Ssowmini case LINK_DUPLEX_HALF: 2833e7801d59Ssowmini (void) strcpy(*prop_val, "half"); 2834e7801d59Ssowmini break; 2835e7801d59Ssowmini default: 2836e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2837e7801d59Ssowmini break; 2838e7801d59Ssowmini } 2839e7801d59Ssowmini *val_cnt = 1; 2840e7801d59Ssowmini return (DLADM_STATUS_OK); 2841e7801d59Ssowmini } 2842e7801d59Ssowmini 2843e7801d59Ssowmini /* ARGSUSED */ 2844e7801d59Ssowmini static dladm_status_t 28454ac67f02SAnurag S. Maskey i_dladm_speed_get(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, 2846da14cebeSEric Cheng char **prop_val, uint_t *val_cnt, uint_t flags, uint_t *perm_flags) 2847e7801d59Ssowmini { 2848e7801d59Ssowmini uint64_t ifspeed = 0; 2849e7801d59Ssowmini dladm_status_t status; 2850e7801d59Ssowmini 28514ac67f02SAnurag S. Maskey if ((status = dladm_get_single_mac_stat(handle, linkid, "ifspeed", 2852e7801d59Ssowmini KSTAT_DATA_UINT64, &ifspeed)) != 0) 2853e7801d59Ssowmini return (status); 28544045d941Ssowmini 28556b9e797cSsowmini if ((ifspeed % 1000000) != 0) { 28566b9e797cSsowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 28576b9e797cSsowmini "%llf", ifspeed / (float)1000000); /* Mbps */ 28586b9e797cSsowmini } else { 2859e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, 2860e7801d59Ssowmini "%llu", ifspeed / 1000000); /* Mbps */ 28616b9e797cSsowmini } 2862e7801d59Ssowmini *val_cnt = 1; 2863da14cebeSEric Cheng *perm_flags = MAC_PROP_PERM_READ; 2864e7801d59Ssowmini return (DLADM_STATUS_OK); 2865e7801d59Ssowmini } 2866e7801d59Ssowmini 2867e7801d59Ssowmini /* ARGSUSED */ 2868e7801d59Ssowmini static dladm_status_t 28694ac67f02SAnurag S. Maskey i_dladm_status_get(dladm_handle_t handle, prop_desc_t *pdp, 28704ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 28714ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2872e7801d59Ssowmini { 2873e7801d59Ssowmini link_state_t link_state; 2874e7801d59Ssowmini dladm_status_t status; 2875e7801d59Ssowmini 28764ac67f02SAnurag S. Maskey status = i_dladm_get_state(handle, linkid, &link_state); 28774045d941Ssowmini if (status != DLADM_STATUS_OK) 2878e7801d59Ssowmini return (status); 2879da14cebeSEric Cheng 2880e7801d59Ssowmini switch (link_state) { 2881e7801d59Ssowmini case LINK_STATE_UP: 2882e7801d59Ssowmini (void) strcpy(*prop_val, "up"); 2883e7801d59Ssowmini break; 2884e7801d59Ssowmini case LINK_STATE_DOWN: 2885e7801d59Ssowmini (void) strcpy(*prop_val, "down"); 2886e7801d59Ssowmini break; 2887e7801d59Ssowmini default: 2888e7801d59Ssowmini (void) strcpy(*prop_val, "unknown"); 2889e7801d59Ssowmini break; 2890e7801d59Ssowmini } 2891e7801d59Ssowmini *val_cnt = 1; 28924784fcbdSSowmini Varadhan *perm_flags = MAC_PROP_PERM_READ; 2893e7801d59Ssowmini return (DLADM_STATUS_OK); 2894e7801d59Ssowmini } 2895e7801d59Ssowmini 2896e7801d59Ssowmini /* ARGSUSED */ 2897e7801d59Ssowmini static dladm_status_t 28984ac67f02SAnurag S. Maskey i_dladm_binary_get(dladm_handle_t handle, prop_desc_t *pdp, 28994ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 29004ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2901e7801d59Ssowmini { 29023fd94f8cSam223141 dld_ioc_macprop_t *dip; 2903e7801d59Ssowmini dladm_status_t status; 2904e7801d59Ssowmini 29054ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2906da14cebeSEric Cheng &status, perm_flags); 29074045d941Ssowmini if (dip == NULL) 2908e7801d59Ssowmini return (status); 2909da14cebeSEric Cheng 2910e7801d59Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%x", dip->pr_val[0]); 2911e7801d59Ssowmini free(dip); 2912e7801d59Ssowmini *val_cnt = 1; 2913e7801d59Ssowmini return (DLADM_STATUS_OK); 2914e7801d59Ssowmini } 2915e7801d59Ssowmini 29166b9e797cSsowmini /* ARGSUSED */ 2917e7801d59Ssowmini static dladm_status_t 29184ac67f02SAnurag S. Maskey i_dladm_uint32_get(dladm_handle_t handle, prop_desc_t *pdp, 29194ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 29204ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 2921e7801d59Ssowmini { 29223fd94f8cSam223141 dld_ioc_macprop_t *dip; 29234045d941Ssowmini uint32_t v = 0; 2924e7801d59Ssowmini uchar_t *cp; 2925e7801d59Ssowmini dladm_status_t status; 2926e7801d59Ssowmini 29274ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 2928da14cebeSEric Cheng &status, perm_flags); 29294045d941Ssowmini if (dip == NULL) 2930e7801d59Ssowmini return (status); 2931da14cebeSEric Cheng 2932e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 2933e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 29344045d941Ssowmini (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%ld", v); 2935e7801d59Ssowmini free(dip); 2936e7801d59Ssowmini *val_cnt = 1; 2937e7801d59Ssowmini return (DLADM_STATUS_OK); 2938e7801d59Ssowmini } 2939e7801d59Ssowmini 2940f0f2c3a5SGirish Moodalbail /* 2941f0f2c3a5SGirish Moodalbail * Determines the size of the structure that needs to be sent to drivers 2942f0f2c3a5SGirish Moodalbail * for retrieving the property range values. 2943f0f2c3a5SGirish Moodalbail */ 2944f0f2c3a5SGirish Moodalbail static int 2945f0f2c3a5SGirish Moodalbail i_dladm_range_size(mac_propval_range_t *r, size_t *sz) 2946f0f2c3a5SGirish Moodalbail { 2947f0f2c3a5SGirish Moodalbail uint_t count = r->mpr_count; 2948f0f2c3a5SGirish Moodalbail 2949f0f2c3a5SGirish Moodalbail *sz = sizeof (mac_propval_range_t); 2950f0f2c3a5SGirish Moodalbail --count; 2951f0f2c3a5SGirish Moodalbail 2952f0f2c3a5SGirish Moodalbail switch (r->mpr_type) { 2953f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: 2954f0f2c3a5SGirish Moodalbail *sz += (count * sizeof (mac_propval_uint32_range_t)); 2955f0f2c3a5SGirish Moodalbail return (0); 2956f0f2c3a5SGirish Moodalbail default: 2957f0f2c3a5SGirish Moodalbail break; 2958f0f2c3a5SGirish Moodalbail } 2959f0f2c3a5SGirish Moodalbail *sz = 0; 2960f0f2c3a5SGirish Moodalbail return (EINVAL); 2961f0f2c3a5SGirish Moodalbail } 2962f0f2c3a5SGirish Moodalbail 2963f0f2c3a5SGirish Moodalbail /* ARGSUSED */ 2964f0f2c3a5SGirish Moodalbail static dladm_status_t 2965f0f2c3a5SGirish Moodalbail i_dladm_range_get(dladm_handle_t handle, prop_desc_t *pdp, 2966f0f2c3a5SGirish Moodalbail datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 2967f0f2c3a5SGirish Moodalbail datalink_media_t media, uint_t flags, uint_t *perm_flags) 2968f0f2c3a5SGirish Moodalbail { 2969f0f2c3a5SGirish Moodalbail dld_ioc_macprop_t *dip; 2970f0f2c3a5SGirish Moodalbail dladm_status_t status = DLADM_STATUS_OK; 2971f0f2c3a5SGirish Moodalbail size_t sz; 2972f0f2c3a5SGirish Moodalbail mac_propval_range_t *rangep; 2973f0f2c3a5SGirish Moodalbail 2974f0f2c3a5SGirish Moodalbail sz = sizeof (mac_propval_range_t); 2975f0f2c3a5SGirish Moodalbail 2976f0f2c3a5SGirish Moodalbail /* 2977f0f2c3a5SGirish Moodalbail * As caller we don't know number of value ranges, the driver 2978f0f2c3a5SGirish Moodalbail * supports. To begin with we assume that number to be 1. If the 2979f0f2c3a5SGirish Moodalbail * buffer size is insufficient, driver returns back with the 2980f0f2c3a5SGirish Moodalbail * actual count of value ranges. See mac.h for more details. 2981f0f2c3a5SGirish Moodalbail */ 2982f0f2c3a5SGirish Moodalbail retry: 2983f0f2c3a5SGirish Moodalbail if ((dip = i_dladm_buf_alloc_by_name(sz, linkid, pdp->pd_name, flags, 2984f0f2c3a5SGirish Moodalbail &status)) == NULL) 2985f0f2c3a5SGirish Moodalbail return (status); 2986f0f2c3a5SGirish Moodalbail 2987f0f2c3a5SGirish Moodalbail status = i_dladm_macprop(handle, dip, B_FALSE); 2988f0f2c3a5SGirish Moodalbail if (status != DLADM_STATUS_OK) { 2989f0f2c3a5SGirish Moodalbail if (status == DLADM_STATUS_TOOSMALL) { 2990f0f2c3a5SGirish Moodalbail int err; 2991f0f2c3a5SGirish Moodalbail 2992f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 2993f0f2c3a5SGirish Moodalbail if ((err = i_dladm_range_size(rangep, &sz)) == 0) { 2994f0f2c3a5SGirish Moodalbail free(dip); 2995f0f2c3a5SGirish Moodalbail goto retry; 2996f0f2c3a5SGirish Moodalbail } else { 2997f0f2c3a5SGirish Moodalbail status = dladm_errno2status(err); 2998f0f2c3a5SGirish Moodalbail } 2999f0f2c3a5SGirish Moodalbail } 3000f0f2c3a5SGirish Moodalbail free(dip); 3001f0f2c3a5SGirish Moodalbail return (status); 3002f0f2c3a5SGirish Moodalbail } 3003f0f2c3a5SGirish Moodalbail rangep = (mac_propval_range_t *)(void *)&dip->pr_val; 3004f0f2c3a5SGirish Moodalbail 3005f0f2c3a5SGirish Moodalbail switch (rangep->mpr_type) { 3006f0f2c3a5SGirish Moodalbail case MAC_PROPVAL_UINT32: { 3007f0f2c3a5SGirish Moodalbail mac_propval_uint32_range_t *ur; 3008f0f2c3a5SGirish Moodalbail uint_t count = rangep->mpr_count, i; 3009f0f2c3a5SGirish Moodalbail 3010f0f2c3a5SGirish Moodalbail ur = &rangep->range_uint32[0]; 3011f0f2c3a5SGirish Moodalbail 3012f0f2c3a5SGirish Moodalbail for (i = 0; i < count; i++, ur++) { 3013f0f2c3a5SGirish Moodalbail if (ur->mpur_min == ur->mpur_max) { 3014f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 3015f0f2c3a5SGirish Moodalbail "%ld", ur->mpur_min); 3016f0f2c3a5SGirish Moodalbail } else { 3017f0f2c3a5SGirish Moodalbail (void) snprintf(prop_val[i], DLADM_PROP_VAL_MAX, 3018f0f2c3a5SGirish Moodalbail "%ld-%ld", ur->mpur_min, ur->mpur_max); 3019f0f2c3a5SGirish Moodalbail } 3020f0f2c3a5SGirish Moodalbail } 3021f0f2c3a5SGirish Moodalbail *val_cnt = count; 3022f0f2c3a5SGirish Moodalbail break; 3023f0f2c3a5SGirish Moodalbail } 3024f0f2c3a5SGirish Moodalbail default: 3025f0f2c3a5SGirish Moodalbail status = DLADM_STATUS_BADARG; 3026f0f2c3a5SGirish Moodalbail break; 3027f0f2c3a5SGirish Moodalbail } 3028f0f2c3a5SGirish Moodalbail free(dip); 3029f0f2c3a5SGirish Moodalbail return (status); 3030f0f2c3a5SGirish Moodalbail } 3031f0f2c3a5SGirish Moodalbail 30326b9e797cSsowmini /* ARGSUSED */ 3033e7801d59Ssowmini static dladm_status_t 3034e75f0919SSebastien Roy i_dladm_tagmode_get(dladm_handle_t handle, prop_desc_t *pdp, 3035e75f0919SSebastien Roy datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 3036e75f0919SSebastien Roy datalink_media_t media, uint_t flags, uint_t *perm_flags) 3037e75f0919SSebastien Roy { 3038e75f0919SSebastien Roy dld_ioc_macprop_t *dip; 3039e75f0919SSebastien Roy link_tagmode_t mode; 3040e75f0919SSebastien Roy dladm_status_t status; 3041e75f0919SSebastien Roy 3042e75f0919SSebastien Roy dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 3043e75f0919SSebastien Roy &status, perm_flags); 3044e75f0919SSebastien Roy if (dip == NULL) 3045e75f0919SSebastien Roy return (status); 3046e75f0919SSebastien Roy (void) memcpy(&mode, dip->pr_val, sizeof (mode)); 3047e75f0919SSebastien Roy free(dip); 3048e75f0919SSebastien Roy 3049e75f0919SSebastien Roy switch (mode) { 3050e75f0919SSebastien Roy case LINK_TAGMODE_NORMAL: 3051e75f0919SSebastien Roy (void) strlcpy(*prop_val, "normal", DLADM_PROP_VAL_MAX); 3052e75f0919SSebastien Roy break; 3053e75f0919SSebastien Roy case LINK_TAGMODE_VLANONLY: 3054e75f0919SSebastien Roy (void) strlcpy(*prop_val, "vlanonly", DLADM_PROP_VAL_MAX); 3055e75f0919SSebastien Roy break; 3056e75f0919SSebastien Roy default: 3057e75f0919SSebastien Roy (void) strlcpy(*prop_val, "unknown", DLADM_PROP_VAL_MAX); 3058e75f0919SSebastien Roy } 3059e75f0919SSebastien Roy *val_cnt = 1; 3060e75f0919SSebastien Roy return (DLADM_STATUS_OK); 3061e75f0919SSebastien Roy } 3062e75f0919SSebastien Roy 3063e75f0919SSebastien Roy /* ARGSUSED */ 3064e75f0919SSebastien Roy static dladm_status_t 30654ac67f02SAnurag S. Maskey i_dladm_flowctl_get(dladm_handle_t handle, prop_desc_t *pdp, 30664ac67f02SAnurag S. Maskey datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 30674ac67f02SAnurag S. Maskey datalink_media_t media, uint_t flags, uint_t *perm_flags) 3068e7801d59Ssowmini { 30693fd94f8cSam223141 dld_ioc_macprop_t *dip; 3070e7801d59Ssowmini link_flowctrl_t v; 3071e7801d59Ssowmini dladm_status_t status; 3072e7801d59Ssowmini uchar_t *cp; 3073e7801d59Ssowmini 30744ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, 3075da14cebeSEric Cheng &status, perm_flags); 30764045d941Ssowmini if (dip == NULL) 3077e7801d59Ssowmini return (status); 3078da14cebeSEric Cheng 3079e7801d59Ssowmini cp = (uchar_t *)dip->pr_val; 3080e7801d59Ssowmini (void) memcpy(&v, cp, sizeof (v)); 3081e7801d59Ssowmini switch (v) { 3082e7801d59Ssowmini case LINK_FLOWCTRL_NONE: 3083e7801d59Ssowmini (void) sprintf(*prop_val, "no"); 3084e7801d59Ssowmini break; 3085e7801d59Ssowmini case LINK_FLOWCTRL_RX: 3086e7801d59Ssowmini (void) sprintf(*prop_val, "rx"); 3087e7801d59Ssowmini break; 3088e7801d59Ssowmini case LINK_FLOWCTRL_TX: 3089e7801d59Ssowmini (void) sprintf(*prop_val, "tx"); 3090e7801d59Ssowmini break; 3091e7801d59Ssowmini case LINK_FLOWCTRL_BI: 3092e7801d59Ssowmini (void) sprintf(*prop_val, "bi"); 3093e7801d59Ssowmini break; 3094e7801d59Ssowmini } 3095e7801d59Ssowmini free(dip); 3096e7801d59Ssowmini *val_cnt = 1; 3097e7801d59Ssowmini return (DLADM_STATUS_OK); 3098e7801d59Ssowmini } 3099e7801d59Ssowmini 3100e7801d59Ssowmini 3101e7801d59Ssowmini /* ARGSUSED */ 3102e7801d59Ssowmini static dladm_status_t 31033361618bSRishi Srivatsavai i_dladm_set_private_prop(dladm_handle_t handle, datalink_id_t linkid, 31044ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t val_cnt, uint_t flags) 31054ac67f02SAnurag S. Maskey 3106e7801d59Ssowmini { 3107bcb5c89dSSowmini Varadhan int i, slen; 3108eae72b5bSSebastien Roy int bufsize = 0; 31093fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 3110e7801d59Ssowmini uchar_t *dp; 3111bcb5c89dSSowmini Varadhan link_attr_t *p; 31124045d941Ssowmini dladm_status_t status = DLADM_STATUS_OK; 3113e7801d59Ssowmini 3114e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 3115e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 3116e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3117e7801d59Ssowmini p = dladm_name2prop(prop_name); 31183fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 3119e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3120e7801d59Ssowmini 31213361618bSRishi Srivatsavai if (!(flags & DLADM_OPT_ACTIVE)) 31223361618bSRishi Srivatsavai return (DLADM_STATUS_OK); 31233361618bSRishi Srivatsavai 3124e7801d59Ssowmini /* 3125e7801d59Ssowmini * private properties: all parsing is done in the kernel. 3126e7801d59Ssowmini * allocate a enough space for each property + its separator (','). 3127e7801d59Ssowmini */ 3128e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 3129e7801d59Ssowmini bufsize += strlen(prop_val[i]) + 1; 3130e7801d59Ssowmini } 31314045d941Ssowmini 31324045d941Ssowmini if (prop_val == NULL) { 31334045d941Ssowmini /* 31344045d941Ssowmini * getting default value. so use more buffer space. 31354045d941Ssowmini */ 3136bcb5c89dSSowmini Varadhan bufsize += DLADM_PROP_BUF_CHUNK; 31374045d941Ssowmini } 31384045d941Ssowmini 3139bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(bufsize + 1, linkid, prop_name, 31403fd94f8cSam223141 (prop_val != NULL ? 0 : MAC_PROP_DEFAULT), &status); 3141e7801d59Ssowmini if (dip == NULL) 3142e7801d59Ssowmini return (status); 3143e7801d59Ssowmini 3144e7801d59Ssowmini dp = (uchar_t *)dip->pr_val; 3145e7801d59Ssowmini slen = 0; 3146bcb5c89dSSowmini Varadhan 31474045d941Ssowmini if (prop_val == NULL) { 31484ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, B_FALSE); 314962ee1d25SArtem Kachitchkine dip->pr_flags = 0; 31504045d941Ssowmini } else { 3151e7801d59Ssowmini for (i = 0; i < val_cnt; i++) { 3152e7801d59Ssowmini int plen = 0; 3153e7801d59Ssowmini 3154e7801d59Ssowmini plen = strlen(prop_val[i]); 3155e7801d59Ssowmini bcopy(prop_val[i], dp, plen); 3156e7801d59Ssowmini slen += plen; 3157e7801d59Ssowmini /* 3158e7801d59Ssowmini * add a "," separator and update dp. 3159e7801d59Ssowmini */ 3160e7801d59Ssowmini if (i != (val_cnt -1)) 3161e7801d59Ssowmini dp[slen++] = ','; 3162e7801d59Ssowmini dp += (plen + 1); 3163e7801d59Ssowmini } 3164e7801d59Ssowmini } 316562ee1d25SArtem Kachitchkine if (status == DLADM_STATUS_OK) 316662ee1d25SArtem Kachitchkine status = i_dladm_macprop(handle, dip, B_TRUE); 31674045d941Ssowmini 3168e7801d59Ssowmini free(dip); 3169e7801d59Ssowmini return (status); 3170e7801d59Ssowmini } 3171e7801d59Ssowmini 3172e7801d59Ssowmini static dladm_status_t 317362ee1d25SArtem Kachitchkine i_dladm_get_priv_prop(dladm_handle_t handle, datalink_id_t linkid, 31744ac67f02SAnurag S. Maskey const char *prop_name, char **prop_val, uint_t *val_cnt, 31754ac67f02SAnurag S. Maskey dladm_prop_type_t type, uint_t dld_flags) 3176e7801d59Ssowmini { 3177e7801d59Ssowmini dladm_status_t status = DLADM_STATUS_OK; 31783fd94f8cSam223141 dld_ioc_macprop_t *dip = NULL; 3179bcb5c89dSSowmini Varadhan link_attr_t *p; 3180e7801d59Ssowmini 3181e7801d59Ssowmini if ((prop_name == NULL && prop_val != NULL) || 3182e7801d59Ssowmini (prop_val != NULL && val_cnt == 0)) 3183e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3184e7801d59Ssowmini 3185e7801d59Ssowmini p = dladm_name2prop(prop_name); 31863fd94f8cSam223141 if (p->pp_id != MAC_PROP_PRIVATE) 3187e7801d59Ssowmini return (DLADM_STATUS_BADARG); 3188e7801d59Ssowmini 3189e7801d59Ssowmini /* 3190e7801d59Ssowmini * private properties: all parsing is done in the kernel. 3191e7801d59Ssowmini */ 3192bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_name(DLADM_PROP_BUF_CHUNK, linkid, prop_name, 3193bcb5c89dSSowmini Varadhan dld_flags, &status); 3194e7801d59Ssowmini if (dip == NULL) 3195e7801d59Ssowmini return (status); 3196e7801d59Ssowmini 31974ac67f02SAnurag S. Maskey if ((status = i_dladm_macprop(handle, dip, B_FALSE)) == 31984ac67f02SAnurag S. Maskey DLADM_STATUS_OK) { 3199afdda45fSVasumathi Sundaram - Sun Microsystems if (type == DLADM_PROP_VAL_PERM) { 3200da14cebeSEric Cheng (void) dladm_perm2str(dip->pr_perm_flags, *prop_val); 320162ee1d25SArtem Kachitchkine } else if (type == DLADM_PROP_VAL_MODIFIABLE) { 320262ee1d25SArtem Kachitchkine *prop_val[0] = '\0'; 3203afdda45fSVasumathi Sundaram - Sun Microsystems } else { 3204afdda45fSVasumathi Sundaram - Sun Microsystems (void) strncpy(*prop_val, dip->pr_val, 3205afdda45fSVasumathi Sundaram - Sun Microsystems DLADM_PROP_VAL_MAX); 3206afdda45fSVasumathi Sundaram - Sun Microsystems } 3207e7801d59Ssowmini *val_cnt = 1; 320862ee1d25SArtem Kachitchkine } else if ((status == DLADM_STATUS_NOTSUP) && 320962ee1d25SArtem Kachitchkine (type == DLADM_PROP_VAL_CURRENT)) { 321062ee1d25SArtem Kachitchkine status = DLADM_STATUS_NOTFOUND; 3211e7801d59Ssowmini } 32124045d941Ssowmini free(dip); 32134045d941Ssowmini return (status); 32144045d941Ssowmini } 32154045d941Ssowmini 32164045d941Ssowmini 32174045d941Ssowmini static dladm_status_t 32184ac67f02SAnurag S. Maskey i_dladm_getset_defval(dladm_handle_t handle, prop_desc_t *pdp, 32194ac67f02SAnurag S. Maskey datalink_id_t linkid, datalink_media_t media, uint_t flags) 32204045d941Ssowmini { 32214045d941Ssowmini dladm_status_t status; 32224045d941Ssowmini char **prop_vals = NULL, *buf; 32234045d941Ssowmini size_t bufsize; 32244045d941Ssowmini uint_t cnt; 32254045d941Ssowmini int i; 3226afdda45fSVasumathi Sundaram - Sun Microsystems uint_t perm_flags; 32274045d941Ssowmini 32284045d941Ssowmini /* 32294045d941Ssowmini * Allocate buffer needed for prop_vals array. We can have at most 32304045d941Ssowmini * DLADM_MAX_PROP_VALCNT char *prop_vals[] entries, where 32314045d941Ssowmini * each entry has max size DLADM_PROP_VAL_MAX 32324045d941Ssowmini */ 32334045d941Ssowmini bufsize = 32344045d941Ssowmini (sizeof (char *) + DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT; 32354045d941Ssowmini buf = malloc(bufsize); 32364045d941Ssowmini prop_vals = (char **)(void *)buf; 32374045d941Ssowmini for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) { 32384045d941Ssowmini prop_vals[i] = buf + 32394045d941Ssowmini sizeof (char *) * DLADM_MAX_PROP_VALCNT + 32404045d941Ssowmini i * DLADM_PROP_VAL_MAX; 32414045d941Ssowmini } 324213a55820Sar224390 324313a55820Sar224390 /* 32443bc21d0aSAruna Ramakrishna - Sun Microsystems * For properties which have pdp->pd_defval.vd_name as a non-empty 32453bc21d0aSAruna Ramakrishna - Sun Microsystems * string, the "" itself is used to reset the property (exceptions 32463bc21d0aSAruna Ramakrishna - Sun Microsystems * are zone and autopush, which populate vdp->vd_val). So 32473bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm can copy pdp->pd_defval over to the val_desc_t passed 32483bc21d0aSAruna Ramakrishna - Sun Microsystems * down on the setprop using the global values in the table. For 32493bc21d0aSAruna Ramakrishna - Sun Microsystems * other cases (vd_name is ""), doing reset-linkprop will cause 32503bc21d0aSAruna Ramakrishna - Sun Microsystems * libdladm to do a getprop to find the default value and then do 32513bc21d0aSAruna Ramakrishna - Sun Microsystems * a setprop to reset the value to default. 325213a55820Sar224390 */ 32534ac67f02SAnurag S. Maskey status = pdp->pd_get(handle, pdp, linkid, prop_vals, &cnt, media, 3254afdda45fSVasumathi Sundaram - Sun Microsystems MAC_PROP_DEFAULT, &perm_flags); 32554045d941Ssowmini if (status == DLADM_STATUS_OK) { 3256afdda45fSVasumathi Sundaram - Sun Microsystems if (perm_flags == MAC_PROP_PERM_RW) { 32574ac67f02SAnurag S. Maskey status = i_dladm_set_single_prop(handle, linkid, 32584ac67f02SAnurag S. Maskey pdp->pd_class, media, pdp, prop_vals, cnt, flags); 32594045d941Ssowmini } 3260afdda45fSVasumathi Sundaram - Sun Microsystems else 3261afdda45fSVasumathi Sundaram - Sun Microsystems status = DLADM_STATUS_NOTSUP; 3262afdda45fSVasumathi Sundaram - Sun Microsystems } 32634045d941Ssowmini free(buf); 3264e7801d59Ssowmini return (status); 3265e7801d59Ssowmini } 3266bcb5c89dSSowmini Varadhan 32674eaa4710SRishi Srivatsavai /* ARGSUSED */ 32684eaa4710SRishi Srivatsavai static dladm_status_t 32694eaa4710SRishi Srivatsavai get_stp_prop(dladm_handle_t handle, struct prop_desc *pd, datalink_id_t linkid, 32704eaa4710SRishi Srivatsavai char **prop_val, uint_t *val_cnt, datalink_media_t media, uint_t flags, 32714eaa4710SRishi Srivatsavai uint_t *perm_flags) 32724eaa4710SRishi Srivatsavai { 32734eaa4710SRishi Srivatsavai const bridge_public_prop_t *bpp; 32744eaa4710SRishi Srivatsavai dladm_status_t retv; 32754eaa4710SRishi Srivatsavai int val, i; 32764eaa4710SRishi Srivatsavai 32774eaa4710SRishi Srivatsavai if (flags != 0) 32784eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 32794eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 32804eaa4710SRishi Srivatsavai *val_cnt = 1; 32814eaa4710SRishi Srivatsavai for (bpp = bridge_prop; bpp->bpp_name != NULL; bpp++) 32824eaa4710SRishi Srivatsavai if (strcmp(bpp->bpp_name, pd->pd_name) == 0) 32834eaa4710SRishi Srivatsavai break; 32844eaa4710SRishi Srivatsavai retv = dladm_bridge_get_port_cfg(handle, linkid, bpp->bpp_code, &val); 32854eaa4710SRishi Srivatsavai /* If the daemon isn't running, then return the persistent value */ 32864eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 32874eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 32884eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 32894eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 32904eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 32914eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 32924eaa4710SRishi Srivatsavai } 32934eaa4710SRishi Srivatsavai if (retv != DLADM_STATUS_OK) { 32944eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 32954eaa4710SRishi Srivatsavai return (retv); 32964eaa4710SRishi Srivatsavai } 32974eaa4710SRishi Srivatsavai if (val == pd->pd_defval.vd_val && pd->pd_defval.vd_name[0] != '\0') { 32984eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 32994eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 33004eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 33014eaa4710SRishi Srivatsavai } 33024eaa4710SRishi Srivatsavai for (i = 0; i < pd->pd_noptval; i++) { 33034eaa4710SRishi Srivatsavai if (val == pd->pd_optval[i].vd_val) { 33044eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_optval[i].vd_name, 33054eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 33064eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 33074eaa4710SRishi Srivatsavai } 33084eaa4710SRishi Srivatsavai } 33094eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", (unsigned)val); 33104eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 33114eaa4710SRishi Srivatsavai } 33124eaa4710SRishi Srivatsavai 33134eaa4710SRishi Srivatsavai /* ARGSUSED1 */ 33144eaa4710SRishi Srivatsavai static dladm_status_t 33154eaa4710SRishi Srivatsavai set_stp_prop(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 33164eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 33174eaa4710SRishi Srivatsavai { 33184eaa4710SRishi Srivatsavai /* 33194eaa4710SRishi Srivatsavai * Special case for mcheck: the daemon resets the value to zero, and we 33204eaa4710SRishi Srivatsavai * don't want the daemon to refresh itself; it leads to deadlock. 33214eaa4710SRishi Srivatsavai */ 33224eaa4710SRishi Srivatsavai if (flags & DLADM_OPT_NOREFRESH) 33234eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 33244eaa4710SRishi Srivatsavai 33254eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 33264eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 33274eaa4710SRishi Srivatsavai } 33284eaa4710SRishi Srivatsavai 33294eaa4710SRishi Srivatsavai /* 33304eaa4710SRishi Srivatsavai * This is used only for stp_priority, stp_cost, and stp_mcheck. 33314eaa4710SRishi Srivatsavai */ 33324eaa4710SRishi Srivatsavai /* ARGSUSED */ 33334eaa4710SRishi Srivatsavai static dladm_status_t 33344eaa4710SRishi Srivatsavai check_stp_prop(dladm_handle_t handle, struct prop_desc *pd, 33354eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 33364eaa4710SRishi Srivatsavai datalink_media_t media) 33374eaa4710SRishi Srivatsavai { 33384eaa4710SRishi Srivatsavai char *cp; 33394eaa4710SRishi Srivatsavai boolean_t iscost; 33404eaa4710SRishi Srivatsavai 33414eaa4710SRishi Srivatsavai if (val_cnt != 1) 33424eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 33434eaa4710SRishi Srivatsavai 33444eaa4710SRishi Srivatsavai if (prop_val == NULL) { 33454eaa4710SRishi Srivatsavai vdp->vd_val = 0; 33464eaa4710SRishi Srivatsavai } else { 33474eaa4710SRishi Srivatsavai /* Only stp_priority and stp_cost use this function */ 33484eaa4710SRishi Srivatsavai iscost = strcmp(pd->pd_name, "stp_cost") == 0; 33494eaa4710SRishi Srivatsavai 33504eaa4710SRishi Srivatsavai if (iscost && strcmp(prop_val[0], "auto") == 0) { 33514eaa4710SRishi Srivatsavai /* Illegal value 0 is allowed to mean "automatic" */ 33524eaa4710SRishi Srivatsavai vdp->vd_val = 0; 33534eaa4710SRishi Srivatsavai } else { 33544eaa4710SRishi Srivatsavai errno = 0; 33554eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 33564eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 33574eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 33584eaa4710SRishi Srivatsavai } 33594eaa4710SRishi Srivatsavai } 33604eaa4710SRishi Srivatsavai 33614eaa4710SRishi Srivatsavai if (iscost) { 33624eaa4710SRishi Srivatsavai return (vdp->vd_val > 65535 ? DLADM_STATUS_BADVAL : 33634eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 33644eaa4710SRishi Srivatsavai } else { 33654eaa4710SRishi Srivatsavai if (vdp->vd_val > 255) 33664eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 33674eaa4710SRishi Srivatsavai /* 33684eaa4710SRishi Srivatsavai * If the user is setting stp_mcheck non-zero, then (per the 33694eaa4710SRishi Srivatsavai * IEEE management standards and UNH testing) we need to check 33704eaa4710SRishi Srivatsavai * whether this link is part of a bridge that is running RSTP. 33714eaa4710SRishi Srivatsavai * If it's not, then setting the flag is an error. Note that 33724eaa4710SRishi Srivatsavai * errors are intentionally discarded here; it's the value 33734eaa4710SRishi Srivatsavai * that's the problem -- it's not a bad value, merely one that 33744eaa4710SRishi Srivatsavai * can't be used now. 33754eaa4710SRishi Srivatsavai */ 33764eaa4710SRishi Srivatsavai if (strcmp(pd->pd_name, "stp_mcheck") == 0 && 33774eaa4710SRishi Srivatsavai vdp->vd_val != 0) { 33784eaa4710SRishi Srivatsavai char bridge[MAXLINKNAMELEN]; 33794eaa4710SRishi Srivatsavai UID_STP_CFG_T cfg; 33804eaa4710SRishi Srivatsavai dladm_bridge_prot_t brprot; 33814eaa4710SRishi Srivatsavai 33824eaa4710SRishi Srivatsavai if (dladm_bridge_getlink(handle, linkid, bridge, 33834eaa4710SRishi Srivatsavai sizeof (bridge)) != DLADM_STATUS_OK || 33844eaa4710SRishi Srivatsavai dladm_bridge_get_properties(bridge, &cfg, 33854eaa4710SRishi Srivatsavai &brprot) != DLADM_STATUS_OK) 33864eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 33874eaa4710SRishi Srivatsavai if (cfg.force_version <= 1) 33884eaa4710SRishi Srivatsavai return (DLADM_STATUS_FAILED); 33894eaa4710SRishi Srivatsavai } 33904eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 33914eaa4710SRishi Srivatsavai } 33924eaa4710SRishi Srivatsavai } 33934eaa4710SRishi Srivatsavai 33944eaa4710SRishi Srivatsavai /* ARGSUSED */ 33954eaa4710SRishi Srivatsavai static dladm_status_t 33964eaa4710SRishi Srivatsavai get_bridge_forward(dladm_handle_t handle, struct prop_desc *pd, 33974eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 33984eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 33994eaa4710SRishi Srivatsavai { 34004eaa4710SRishi Srivatsavai dladm_status_t retv; 34014eaa4710SRishi Srivatsavai uint_t val; 34024eaa4710SRishi Srivatsavai 34034eaa4710SRishi Srivatsavai if (flags != 0) 34044eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 34054eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 34064eaa4710SRishi Srivatsavai *val_cnt = 1; 34074eaa4710SRishi Srivatsavai retv = dladm_bridge_get_forwarding(handle, linkid, &val); 34084eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_NOTFOUND) { 34094eaa4710SRishi Srivatsavai if (i_dladm_get_linkprop_db(handle, linkid, pd->pd_name, 34104eaa4710SRishi Srivatsavai prop_val, val_cnt) != DLADM_STATUS_OK) 34114eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, pd->pd_defval.vd_name, 34124eaa4710SRishi Srivatsavai DLADM_PROP_VAL_MAX); 34134eaa4710SRishi Srivatsavai return (DLADM_STATUS_OK); 34144eaa4710SRishi Srivatsavai } 34154eaa4710SRishi Srivatsavai if (retv == DLADM_STATUS_OK) 34164eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", val); 34174eaa4710SRishi Srivatsavai else 34184eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 34194eaa4710SRishi Srivatsavai return (retv); 34204eaa4710SRishi Srivatsavai } 34214eaa4710SRishi Srivatsavai 34224eaa4710SRishi Srivatsavai /* ARGSUSED */ 34234eaa4710SRishi Srivatsavai static dladm_status_t 34244eaa4710SRishi Srivatsavai set_bridge_forward(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 34254eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 34264eaa4710SRishi Srivatsavai { 34274eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 34284eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 34294eaa4710SRishi Srivatsavai } 34304eaa4710SRishi Srivatsavai 34314eaa4710SRishi Srivatsavai /* ARGSUSED */ 34324eaa4710SRishi Srivatsavai static dladm_status_t 34334eaa4710SRishi Srivatsavai get_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 34344eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t *val_cnt, 34354eaa4710SRishi Srivatsavai datalink_media_t media, uint_t flags, uint_t *perm_flags) 34364eaa4710SRishi Srivatsavai { 34374eaa4710SRishi Srivatsavai dladm_status_t status; 34384eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 34394eaa4710SRishi Srivatsavai uint16_t pvid; 34404eaa4710SRishi Srivatsavai 34414eaa4710SRishi Srivatsavai if (flags != 0) 34424eaa4710SRishi Srivatsavai return (DLADM_STATUS_NOTSUP); 34434eaa4710SRishi Srivatsavai *perm_flags = MAC_PROP_PERM_RW; 34444eaa4710SRishi Srivatsavai *val_cnt = 1; 34454eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 34464eaa4710SRishi Srivatsavai 0, &status); 34474eaa4710SRishi Srivatsavai if (dip == NULL) 34484eaa4710SRishi Srivatsavai return (status); 34494eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_FALSE); 34504eaa4710SRishi Srivatsavai if (status == DLADM_STATUS_OK) { 34514eaa4710SRishi Srivatsavai (void) memcpy(&pvid, dip->pr_val, sizeof (pvid)); 34524eaa4710SRishi Srivatsavai (void) snprintf(*prop_val, DLADM_PROP_VAL_MAX, "%u", pvid); 34534eaa4710SRishi Srivatsavai } else { 34544eaa4710SRishi Srivatsavai (void) strlcpy(*prop_val, "?", DLADM_PROP_VAL_MAX); 34554eaa4710SRishi Srivatsavai } 34564eaa4710SRishi Srivatsavai free(dip); 34574eaa4710SRishi Srivatsavai return (status); 34584eaa4710SRishi Srivatsavai } 34594eaa4710SRishi Srivatsavai 34604eaa4710SRishi Srivatsavai /* ARGSUSED */ 34614eaa4710SRishi Srivatsavai static dladm_status_t 34624eaa4710SRishi Srivatsavai set_bridge_pvid(dladm_handle_t handle, prop_desc_t *pd, datalink_id_t linkid, 34634eaa4710SRishi Srivatsavai val_desc_t *vdp, uint_t val_cnt, uint_t flags, datalink_media_t media) 34644eaa4710SRishi Srivatsavai { 34654eaa4710SRishi Srivatsavai dladm_status_t status; 34664eaa4710SRishi Srivatsavai dld_ioc_macprop_t *dip; 34674eaa4710SRishi Srivatsavai uint16_t pvid; 34684eaa4710SRishi Srivatsavai 34694eaa4710SRishi Srivatsavai dip = i_dladm_buf_alloc_by_id(sizeof (uint16_t), linkid, MAC_PROP_PVID, 34704eaa4710SRishi Srivatsavai 0, &status); 34714eaa4710SRishi Srivatsavai if (dip == NULL) 34724eaa4710SRishi Srivatsavai return (status); 34734eaa4710SRishi Srivatsavai pvid = vdp->vd_val; 34744eaa4710SRishi Srivatsavai (void) memcpy(dip->pr_val, &pvid, sizeof (pvid)); 34754eaa4710SRishi Srivatsavai status = i_dladm_macprop(handle, dip, B_TRUE); 34764eaa4710SRishi Srivatsavai free(dip); 34774eaa4710SRishi Srivatsavai if (status != DLADM_STATUS_OK) 34784eaa4710SRishi Srivatsavai return (status); 34794eaa4710SRishi Srivatsavai 34804eaa4710SRishi Srivatsavai /* Tell the running daemon, if any */ 34814eaa4710SRishi Srivatsavai return (dladm_bridge_refresh(handle, linkid)); 34824eaa4710SRishi Srivatsavai } 34834eaa4710SRishi Srivatsavai 34844eaa4710SRishi Srivatsavai /* ARGSUSED */ 34854eaa4710SRishi Srivatsavai static dladm_status_t 34864eaa4710SRishi Srivatsavai check_bridge_pvid(dladm_handle_t handle, struct prop_desc *pd, 34874eaa4710SRishi Srivatsavai datalink_id_t linkid, char **prop_val, uint_t val_cnt, val_desc_t *vdp, 34884eaa4710SRishi Srivatsavai datalink_media_t media) 34894eaa4710SRishi Srivatsavai { 34904eaa4710SRishi Srivatsavai char *cp; 34914eaa4710SRishi Srivatsavai 34924eaa4710SRishi Srivatsavai if (val_cnt != 1) 34934eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVALCNT); 34944eaa4710SRishi Srivatsavai 34954eaa4710SRishi Srivatsavai if (prop_val == NULL) { 34964eaa4710SRishi Srivatsavai vdp->vd_val = 1; 34974eaa4710SRishi Srivatsavai } else { 34984eaa4710SRishi Srivatsavai errno = 0; 34994eaa4710SRishi Srivatsavai vdp->vd_val = strtoul(prop_val[0], &cp, 0); 35004eaa4710SRishi Srivatsavai if (errno != 0 || *cp != '\0') 35014eaa4710SRishi Srivatsavai return (DLADM_STATUS_BADVAL); 35024eaa4710SRishi Srivatsavai } 35034eaa4710SRishi Srivatsavai 35044eaa4710SRishi Srivatsavai return (vdp->vd_val > VLAN_ID_MAX ? DLADM_STATUS_BADVAL : 35054eaa4710SRishi Srivatsavai DLADM_STATUS_OK); 35064eaa4710SRishi Srivatsavai } 35074eaa4710SRishi Srivatsavai 3508bcb5c89dSSowmini Varadhan dladm_status_t 35094ac67f02SAnurag S. Maskey i_dladm_wlan_param(dladm_handle_t handle, datalink_id_t linkid, void *buf, 35104ac67f02SAnurag S. Maskey mac_prop_id_t cmd, size_t len, boolean_t set) 3511bcb5c89dSSowmini Varadhan { 3512bcb5c89dSSowmini Varadhan uint32_t flags; 3513bcb5c89dSSowmini Varadhan dladm_status_t status; 3514bcb5c89dSSowmini Varadhan uint32_t media; 3515bcb5c89dSSowmini Varadhan dld_ioc_macprop_t *dip; 3516bcb5c89dSSowmini Varadhan void *dp; 3517bcb5c89dSSowmini Varadhan 35184ac67f02SAnurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, NULL, 35194ac67f02SAnurag S. Maskey &media, NULL, 0)) != DLADM_STATUS_OK) { 3520bcb5c89dSSowmini Varadhan return (status); 3521bcb5c89dSSowmini Varadhan } 3522bcb5c89dSSowmini Varadhan 3523bcb5c89dSSowmini Varadhan if (media != DL_WIFI) 3524bcb5c89dSSowmini Varadhan return (DLADM_STATUS_BADARG); 3525bcb5c89dSSowmini Varadhan 3526bcb5c89dSSowmini Varadhan if (!(flags & DLADM_OPT_ACTIVE)) 3527bcb5c89dSSowmini Varadhan return (DLADM_STATUS_TEMPONLY); 3528bcb5c89dSSowmini Varadhan 3529bcb5c89dSSowmini Varadhan if (len == (MAX_BUF_LEN - WIFI_BUF_OFFSET)) 3530bcb5c89dSSowmini Varadhan len = MAX_BUF_LEN - sizeof (dld_ioc_macprop_t) - 1; 3531bcb5c89dSSowmini Varadhan 3532bcb5c89dSSowmini Varadhan dip = i_dladm_buf_alloc_by_id(len, linkid, cmd, 0, &status); 3533bcb5c89dSSowmini Varadhan if (dip == NULL) 3534bcb5c89dSSowmini Varadhan return (DLADM_STATUS_NOMEM); 3535bcb5c89dSSowmini Varadhan 3536bcb5c89dSSowmini Varadhan dp = (uchar_t *)dip->pr_val; 3537bcb5c89dSSowmini Varadhan if (set) 3538bcb5c89dSSowmini Varadhan (void) memcpy(dp, buf, len); 3539bcb5c89dSSowmini Varadhan 35404ac67f02SAnurag S. Maskey status = i_dladm_macprop(handle, dip, set); 35410b8f0546SSowmini Varadhan if (status == DLADM_STATUS_OK) { 3542bcb5c89dSSowmini Varadhan if (!set) 3543bcb5c89dSSowmini Varadhan (void) memcpy(buf, dp, len); 3544bcb5c89dSSowmini Varadhan } 3545bcb5c89dSSowmini Varadhan 3546bcb5c89dSSowmini Varadhan free(dip); 3547bcb5c89dSSowmini Varadhan return (status); 3548bcb5c89dSSowmini Varadhan } 3549bcb5c89dSSowmini Varadhan 3550da14cebeSEric Cheng dladm_status_t 3551da14cebeSEric Cheng dladm_parse_link_props(char *str, dladm_arg_list_t **listp, boolean_t novalues) 3552da14cebeSEric Cheng { 355362ee1d25SArtem Kachitchkine return (dladm_parse_args(str, listp, novalues)); 3554da14cebeSEric Cheng } 3555da14cebeSEric Cheng 3556da14cebeSEric Cheng /* 3557da14cebeSEric Cheng * Retrieve the one link property from the database 3558da14cebeSEric Cheng */ 3559da14cebeSEric Cheng /*ARGSUSED*/ 3560da14cebeSEric Cheng static int 35614ac67f02SAnurag S. Maskey i_dladm_get_one_prop(dladm_handle_t handle, datalink_id_t linkid, 35624ac67f02SAnurag S. Maskey const char *prop_name, void *arg) 3563da14cebeSEric Cheng { 3564da14cebeSEric Cheng dladm_arg_list_t *proplist = arg; 3565da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3566da14cebeSEric Cheng 3567da14cebeSEric Cheng aip = &proplist->al_info[proplist->al_count]; 3568da14cebeSEric Cheng /* 3569da14cebeSEric Cheng * it is fine to point to prop_name since prop_name points to the 3570da14cebeSEric Cheng * prop_table[n].pd_name. 3571da14cebeSEric Cheng */ 3572da14cebeSEric Cheng aip->ai_name = prop_name; 3573da14cebeSEric Cheng 35744ac67f02SAnurag S. Maskey (void) dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_PERSISTENT, 35754ac67f02SAnurag S. Maskey prop_name, aip->ai_val, &aip->ai_count); 3576da14cebeSEric Cheng 3577da14cebeSEric Cheng if (aip->ai_count != 0) 3578da14cebeSEric Cheng proplist->al_count++; 3579da14cebeSEric Cheng 3580da14cebeSEric Cheng return (DLADM_WALK_CONTINUE); 3581da14cebeSEric Cheng } 3582da14cebeSEric Cheng 3583da14cebeSEric Cheng 3584da14cebeSEric Cheng /* 3585da14cebeSEric Cheng * Retrieve all link properties for a link from the database and 3586da14cebeSEric Cheng * return a property list. 3587da14cebeSEric Cheng */ 3588da14cebeSEric Cheng dladm_status_t 35894ac67f02SAnurag S. Maskey dladm_link_get_proplist(dladm_handle_t handle, datalink_id_t linkid, 35904ac67f02SAnurag S. Maskey dladm_arg_list_t **listp) 3591da14cebeSEric Cheng { 3592da14cebeSEric Cheng dladm_arg_list_t *list; 3593da14cebeSEric Cheng dladm_status_t status = DLADM_STATUS_OK; 3594da14cebeSEric Cheng 3595da14cebeSEric Cheng list = calloc(1, sizeof (dladm_arg_list_t)); 3596da14cebeSEric Cheng if (list == NULL) 3597da14cebeSEric Cheng return (dladm_errno2status(errno)); 3598da14cebeSEric Cheng 35994ac67f02SAnurag S. Maskey status = dladm_walk_linkprop(handle, linkid, list, 36004ac67f02SAnurag S. Maskey i_dladm_get_one_prop); 3601da14cebeSEric Cheng 3602da14cebeSEric Cheng *listp = list; 3603da14cebeSEric Cheng return (status); 3604da14cebeSEric Cheng } 3605da14cebeSEric Cheng 3606da14cebeSEric Cheng /* 3607da14cebeSEric Cheng * Retrieve the named property from a proplist, check the value and 3608da14cebeSEric Cheng * convert to a kernel structure. 3609da14cebeSEric Cheng */ 3610da14cebeSEric Cheng static dladm_status_t 36114ac67f02SAnurag S. Maskey i_dladm_link_proplist_extract_one(dladm_handle_t handle, 3612*25ec3e3dSEric Cheng dladm_arg_list_t *proplist, const char *name, void *arg) 3613da14cebeSEric Cheng { 3614da14cebeSEric Cheng dladm_status_t status; 3615da14cebeSEric Cheng dladm_arg_info_t *aip = NULL; 3616da14cebeSEric Cheng int i, j; 3617da14cebeSEric Cheng 3618da14cebeSEric Cheng /* Find named property in proplist */ 3619da14cebeSEric Cheng for (i = 0; i < proplist->al_count; i++) { 3620da14cebeSEric Cheng aip = &proplist->al_info[i]; 3621da14cebeSEric Cheng if (strcasecmp(aip->ai_name, name) == 0) 3622da14cebeSEric Cheng break; 3623da14cebeSEric Cheng } 3624da14cebeSEric Cheng 3625da14cebeSEric Cheng /* Property not in list */ 3626da14cebeSEric Cheng if (i == proplist->al_count) 3627da14cebeSEric Cheng return (DLADM_STATUS_OK); 3628da14cebeSEric Cheng 3629da14cebeSEric Cheng for (i = 0; i < DLADM_MAX_PROPS; i++) { 3630da14cebeSEric Cheng prop_desc_t *pdp = &prop_table[i]; 3631da14cebeSEric Cheng val_desc_t *vdp; 3632da14cebeSEric Cheng 3633da14cebeSEric Cheng vdp = malloc(sizeof (val_desc_t) * aip->ai_count); 3634da14cebeSEric Cheng if (vdp == NULL) 3635da14cebeSEric Cheng return (DLADM_STATUS_NOMEM); 3636da14cebeSEric Cheng 3637da14cebeSEric Cheng if (strcasecmp(aip->ai_name, pdp->pd_name) != 0) 3638da14cebeSEric Cheng continue; 3639da14cebeSEric Cheng 3640da14cebeSEric Cheng if (aip->ai_val == NULL) 3641da14cebeSEric Cheng return (DLADM_STATUS_BADARG); 3642da14cebeSEric Cheng 3643da14cebeSEric Cheng /* Check property value */ 3644da14cebeSEric Cheng if (pdp->pd_check != NULL) { 36454ac67f02SAnurag S. Maskey status = pdp->pd_check(handle, pdp, 0, aip->ai_val, 3646da14cebeSEric Cheng aip->ai_count, vdp, 0); 3647da14cebeSEric Cheng } else { 3648da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3649da14cebeSEric Cheng } 3650da14cebeSEric Cheng 3651da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3652da14cebeSEric Cheng return (status); 3653da14cebeSEric Cheng 3654da14cebeSEric Cheng for (j = 0; j < DLADM_MAX_RSRC_PROP; j++) { 3655da14cebeSEric Cheng resource_prop_t *rpp = &rsrc_prop_table[j]; 3656da14cebeSEric Cheng 3657da14cebeSEric Cheng if (strcasecmp(aip->ai_name, rpp->rp_name) != 0) 3658da14cebeSEric Cheng continue; 3659da14cebeSEric Cheng 3660da14cebeSEric Cheng /* Extract kernel structure */ 3661da14cebeSEric Cheng if (rpp->rp_extract != NULL) { 3662*25ec3e3dSEric Cheng status = rpp->rp_extract(vdp, 3663*25ec3e3dSEric Cheng aip->ai_count, arg); 3664da14cebeSEric Cheng } else { 3665da14cebeSEric Cheng status = DLADM_STATUS_BADARG; 3666da14cebeSEric Cheng } 3667da14cebeSEric Cheng break; 3668da14cebeSEric Cheng } 3669da14cebeSEric Cheng 3670da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3671da14cebeSEric Cheng return (status); 3672da14cebeSEric Cheng 3673da14cebeSEric Cheng break; 3674da14cebeSEric Cheng } 3675da14cebeSEric Cheng return (status); 3676da14cebeSEric Cheng } 3677da14cebeSEric Cheng 3678da14cebeSEric Cheng /* 3679da14cebeSEric Cheng * Extract properties from a proplist and convert to mac_resource_props_t. 3680da14cebeSEric Cheng */ 3681da14cebeSEric Cheng dladm_status_t 36824ac67f02SAnurag S. Maskey dladm_link_proplist_extract(dladm_handle_t handle, dladm_arg_list_t *proplist, 3683da14cebeSEric Cheng mac_resource_props_t *mrp) 3684da14cebeSEric Cheng { 3685*25ec3e3dSEric Cheng dladm_status_t status; 3686*25ec3e3dSEric Cheng int i; 3687da14cebeSEric Cheng 3688*25ec3e3dSEric Cheng for (i = 0; i < DLADM_MAX_RSRC_PROP; i++) { 3689*25ec3e3dSEric Cheng status = i_dladm_link_proplist_extract_one(handle, 3690*25ec3e3dSEric Cheng proplist, rsrc_prop_table[i].rp_name, mrp); 3691da14cebeSEric Cheng if (status != DLADM_STATUS_OK) 3692da14cebeSEric Cheng return (status); 3693*25ec3e3dSEric Cheng } 3694da14cebeSEric Cheng return (status); 3695da14cebeSEric Cheng } 3696da14cebeSEric Cheng 3697da14cebeSEric Cheng static const char * 3698da14cebeSEric Cheng dladm_perm2str(uint_t perm, char *buf) 3699da14cebeSEric Cheng { 3700da14cebeSEric Cheng (void) snprintf(buf, DLADM_STRSIZE, "%c%c", 3701da14cebeSEric Cheng ((perm & MAC_PROP_PERM_READ) != 0) ? 'r' : '-', 3702da14cebeSEric Cheng ((perm & MAC_PROP_PERM_WRITE) != 0) ? 'w' : '-'); 3703da14cebeSEric Cheng return (buf); 3704da14cebeSEric Cheng } 37054784fcbdSSowmini Varadhan 37064784fcbdSSowmini Varadhan dladm_status_t 37074ac67f02SAnurag S. Maskey i_dladm_get_state(dladm_handle_t handle, datalink_id_t linkid, 37084ac67f02SAnurag S. Maskey link_state_t *state) 37094784fcbdSSowmini Varadhan { 37104784fcbdSSowmini Varadhan dld_ioc_macprop_t *dip; 37114784fcbdSSowmini Varadhan dladm_status_t status; 37124784fcbdSSowmini Varadhan uint_t perms; 37134784fcbdSSowmini Varadhan 37144ac67f02SAnurag S. Maskey dip = i_dladm_get_public_prop(handle, linkid, "state", 0, &status, 37154ac67f02SAnurag S. Maskey &perms); 37164784fcbdSSowmini Varadhan if (status != DLADM_STATUS_OK) 37174784fcbdSSowmini Varadhan return (status); 37184784fcbdSSowmini Varadhan (void) memcpy(state, dip->pr_val, sizeof (*state)); 37194784fcbdSSowmini Varadhan free(dip); 37204784fcbdSSowmini Varadhan return (status); 37214784fcbdSSowmini Varadhan } 372262ee1d25SArtem Kachitchkine 372362ee1d25SArtem Kachitchkine boolean_t 372462ee1d25SArtem Kachitchkine dladm_attr_is_linkprop(const char *name) 372562ee1d25SArtem Kachitchkine { 372662ee1d25SArtem Kachitchkine /* non-property attribute names */ 372762ee1d25SArtem Kachitchkine const char *nonprop[] = { 372862ee1d25SArtem Kachitchkine /* dlmgmtd core attributes */ 372962ee1d25SArtem Kachitchkine "name", 373062ee1d25SArtem Kachitchkine "class", 373162ee1d25SArtem Kachitchkine "media", 373262ee1d25SArtem Kachitchkine FPHYMAJ, 373362ee1d25SArtem Kachitchkine FPHYINST, 373462ee1d25SArtem Kachitchkine FDEVNAME, 373562ee1d25SArtem Kachitchkine 373662ee1d25SArtem Kachitchkine /* other attributes for vlan, aggr, etc */ 373762ee1d25SArtem Kachitchkine DLADM_ATTR_NAMES 373862ee1d25SArtem Kachitchkine }; 373962ee1d25SArtem Kachitchkine boolean_t is_nonprop = B_FALSE; 374062ee1d25SArtem Kachitchkine int i; 374162ee1d25SArtem Kachitchkine 374262ee1d25SArtem Kachitchkine for (i = 0; i < sizeof (nonprop) / sizeof (nonprop[0]); i++) { 374362ee1d25SArtem Kachitchkine if (strcmp(name, nonprop[i]) == 0) { 374462ee1d25SArtem Kachitchkine is_nonprop = B_TRUE; 374562ee1d25SArtem Kachitchkine break; 374662ee1d25SArtem Kachitchkine } 374762ee1d25SArtem Kachitchkine } 374862ee1d25SArtem Kachitchkine 374962ee1d25SArtem Kachitchkine return (!is_nonprop); 375062ee1d25SArtem Kachitchkine } 3751