diff options
Diffstat (limited to 'usr/src/lib/libdladm/common/linkprop.c')
-rw-r--r-- | usr/src/lib/libdladm/common/linkprop.c | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/usr/src/lib/libdladm/common/linkprop.c b/usr/src/lib/libdladm/common/linkprop.c index 171e23dc2c..5fdb082472 100644 --- a/usr/src/lib/libdladm/common/linkprop.c +++ b/usr/src/lib/libdladm/common/linkprop.c @@ -154,11 +154,13 @@ static pd_getf_t get_zone, get_autopush, get_rate_mod, get_rate, get_bridge_pvid, get_protection, get_rxrings, get_txrings, get_cntavail, get_secondary_macs, get_allowedips, get_allowedcids, get_pool, - get_rings_range, get_linkmode_prop; + get_rings_range, get_linkmode_prop, + get_promisc_filtered; static pd_setf_t set_zone, set_rate, set_powermode, set_radio, set_public_prop, set_resource, set_stp_prop, - set_bridge_forward, set_bridge_pvid, set_secondary_macs; + set_bridge_forward, set_bridge_pvid, set_secondary_macs, + set_promisc_filtered; static pd_checkf_t check_zone, check_autopush, check_rate, check_hoplimit, check_encaplim, check_uint32, check_maxbw, check_cpus, @@ -382,6 +384,8 @@ static link_attr_t link_attr[] = { { MAC_PROP_IB_LINKMODE, sizeof (uint32_t), "linkmode"}, + { MAC_PROP_VN_PROMISC_FILTERED, sizeof (boolean_t), "promisc-filtered"}, + { MAC_PROP_SECONDARY_ADDRS, sizeof (mac_secondary_addr_t), "secondary-macs"}, @@ -439,6 +443,11 @@ static val_desc_t link_protect_vals[] = { { "dhcp-nospoof", MPT_DHCPNOSPOOF }, }; +static val_desc_t link_promisc_filtered_vals[] = { + { "off", B_FALSE }, + { "on", B_TRUE }, +}; + static val_desc_t dladm_wlan_radio_vals[] = { { "on", DLADM_WLAN_RADIO_ON }, { "off", DLADM_WLAN_RADIO_OFF } @@ -755,6 +764,12 @@ static prop_desc_t prop_table[] = { set_resource, NULL, get_protection, check_prop, 0, DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE }, + { "promisc-filtered", { "on", 1 }, + link_promisc_filtered_vals, VALCNT(link_promisc_filtered_vals), + set_promisc_filtered, NULL, get_promisc_filtered, check_prop, 0, + DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE }, + + { "allowed-ips", { "--", 0 }, NULL, 0, set_resource, NULL, get_allowedips, check_allowedips, PD_CHECK_ALLOC, @@ -1586,6 +1601,9 @@ set_zone(dladm_handle_t handle, prop_desc_t *pdp, datalink_id_t linkid, if (zid_new == zid_old) return (DLADM_STATUS_OK); + if (flags & DLADM_OPT_TRANSIENT) + dzp->diz_transient = B_TRUE; + if ((status = set_public_prop(handle, pdp, linkid, vdp, val_cnt, flags, media)) != DLADM_STATUS_OK) return (status); @@ -4827,3 +4845,50 @@ get_linkmode_prop(dladm_handle_t handle, prop_desc_t *pdp, *val_cnt = 1; return (DLADM_STATUS_OK); } + +/*ARGSUSED*/ +static dladm_status_t +get_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, char **prop_val, uint_t *val_cnt, + datalink_media_t media, uint_t flags, uint_t *perm_flags) +{ + char *s; + dladm_status_t status; + boolean_t filt; + + status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags, + perm_flags, &filt, sizeof (filt)); + if (status != DLADM_STATUS_OK) + return (status); + + if (filt != 0) + s = link_promisc_filtered_vals[1].vd_name; + else + s = link_promisc_filtered_vals[0].vd_name; + (void) snprintf(prop_val[0], DLADM_STRSIZE, "%s", s); + + *val_cnt = 1; + return (DLADM_STATUS_OK); +} + +/* ARGSUSED */ +static dladm_status_t +set_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp, + datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags, + datalink_media_t media) +{ + dld_ioc_macprop_t *dip; + dladm_status_t status = DLADM_STATUS_OK; + + dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name, + 0, &status); + + if (dip == NULL) + return (status); + + (void) memcpy(dip->pr_val, &vdp->vd_val, dip->pr_valsize); + status = i_dladm_macprop(handle, dip, B_TRUE); + + free(dip); + return (status); +} |