summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/dld/dld_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/dld/dld_drv.c')
-rw-r--r--usr/src/uts/common/io/dld/dld_drv.c74
1 files changed, 73 insertions, 1 deletions
diff --git a/usr/src/uts/common/io/dld/dld_drv.c b/usr/src/uts/common/io/dld/dld_drv.c
index 2b394c051d..e09b6eff13 100644
--- a/usr/src/uts/common/io/dld/dld_drv.c
+++ b/usr/src/uts/common/io/dld/dld_drv.c
@@ -431,8 +431,8 @@ drv_ioc_attr(dld_ctl_str_t *ctls, mblk_t *mp)
dls_devnet_rele_tmp(dlh);
goto failed;
}
+ mac_sdu_get(dvp->dv_dlp->dl_mh, NULL, &diap->dia_max_sdu);
- diap->dia_max_sdu = dvp->dv_dlp->dl_mip->mi_sdu_max;
dls_vlan_rele(dvp);
dls_devnet_rele_tmp(dlh);
@@ -507,6 +507,72 @@ failed:
}
/*
+ * DLDIOCSETPROP
+ */
+static void
+drv_ioc_prop_common(dld_ctl_str_t *ctls, mblk_t *mp, boolean_t set)
+{
+ int err = EINVAL, dsize;
+ queue_t *q = ctls->cs_wq;
+ dld_ioc_prop_t *dipp;
+ dls_dl_handle_t dlh;
+ dls_vlan_t *dvp;
+ datalink_id_t linkid;
+ mac_prop_t macprop;
+
+ if ((err = miocpullup(mp, sizeof (dld_ioc_prop_t))) != 0)
+ goto done;
+ dipp = (dld_ioc_prop_t *)mp->b_cont->b_rptr;
+
+ dsize = sizeof (dld_ioc_prop_t) + dipp->pr_valsize - 1;
+ if ((err = miocpullup(mp, dsize)) != 0)
+ goto done;
+ dipp = (dld_ioc_prop_t *)mp->b_cont->b_rptr;
+
+ if ((err = dls_mgmt_get_linkid(dipp->pr_linkname, &linkid)) != 0)
+ goto done;
+
+ if ((err = dls_devnet_hold_tmp(linkid, &dlh)) != 0)
+ goto done;
+
+ if ((err = dls_vlan_hold(dls_devnet_mac(dlh),
+ dls_devnet_vid(dlh), &dvp, B_FALSE, B_FALSE)) != 0) {
+ dls_devnet_rele_tmp(dlh);
+ goto done;
+ }
+
+ macprop.mp_name = dipp->pr_name;
+ macprop.mp_id = dipp->pr_num;
+
+ if (set)
+ err = mac_set_prop(dvp->dv_dlp->dl_mh, &macprop,
+ dipp->pr_val, dipp->pr_valsize);
+ else
+ err = mac_get_prop(dvp->dv_dlp->dl_mh, &macprop,
+ dipp->pr_val, dipp->pr_valsize);
+
+ dls_vlan_rele(dvp);
+ dls_devnet_rele_tmp(dlh);
+done:
+ if (err == 0)
+ miocack(q, mp, dsize, 0);
+ else
+ miocnak(q, mp, 0, err);
+}
+
+static void
+drv_ioc_setprop(dld_ctl_str_t *ctls, mblk_t *mp)
+{
+ drv_ioc_prop_common(ctls, mp, B_TRUE);
+}
+
+static void
+drv_ioc_getprop(dld_ctl_str_t *ctls, mblk_t *mp)
+{
+ drv_ioc_prop_common(ctls, mp, B_FALSE);
+}
+
+/*
* DLDIOC_CREATE_VLAN
*/
static void
@@ -900,6 +966,12 @@ drv_ioc(dld_ctl_str_t *ctls, mblk_t *mp)
case DLDIOC_SECOBJ_UNSET:
drv_ioc_secobj_unset(ctls, mp);
return;
+ case DLDIOCSETPROP:
+ drv_ioc_setprop(ctls, mp);
+ return;
+ case DLDIOCGETPROP:
+ drv_ioc_getprop(ctls, mp);
+ return;
case DLDIOC_CREATE_VLAN:
drv_ioc_create_vlan(ctls, mp);
return;