summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authorAruna Ramakrishna - Sun Microsystems <Aruna.Ramakrishna@Sun.COM>2008-08-15 14:27:06 -0400
committerAruna Ramakrishna - Sun Microsystems <Aruna.Ramakrishna@Sun.COM>2008-08-15 14:27:06 -0400
commit3bc21d0a9c7b31b1132c254e389a4114c23bcf00 (patch)
treedaf267db046835b41826cd114140ca0503b4bbcc /usr/src/uts/common
parent43afaaa8b73f73af765f4fa90f39a0f86cb8a364 (diff)
downloadillumos-joyent-3bc21d0a9c7b31b1132c254e389a4114c23bcf00.tar.gz
6714745 zone/autopush should be implemented using DLDIOC_*MACPROP ioctls.
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/io/dld/dld_drv.c190
-rw-r--r--usr/src/uts/common/sys/dld.h42
-rw-r--r--usr/src/uts/common/sys/mac.h4
3 files changed, 83 insertions, 153 deletions
diff --git a/usr/src/uts/common/io/dld/dld_drv.c b/usr/src/uts/common/io/dld/dld_drv.c
index 246a4054ad..0ab4c8ee14 100644
--- a/usr/src/uts/common/io/dld/dld_drv.c
+++ b/usr/src/uts/common/io/dld/dld_drv.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Data-Link Driver
*/
@@ -69,6 +67,9 @@ static void drv_secobj_fini(void);
static void drv_ioc_secobj_set(dld_ctl_str_t *, mblk_t *);
static void drv_ioc_secobj_get(dld_ctl_str_t *, mblk_t *);
static void drv_ioc_secobj_unset(dld_ctl_str_t *, mblk_t *);
+static int drv_ioc_setap(datalink_id_t, struct dlautopush *);
+static int drv_ioc_getap(datalink_id_t, struct dlautopush *);
+static int drv_ioc_clrap(datalink_id_t);
/*
* The following entry points are private to dld and are used for control
@@ -519,8 +520,11 @@ drv_ioc_prop_common(dld_ctl_str_t *ctls, mblk_t *mp, boolean_t set)
dls_vlan_t *dvp;
datalink_id_t linkid;
mac_prop_t macprop;
+ uchar_t *cp;
+ struct dlautopush *dlap;
+ dld_ioc_zid_t *dzp;
- if ((err = miocpullup(mp, sizeof (dld_ioc_macprop_t))) != 0)
+ if ((err = miocpullup(mp, sizeof (dld_ioc_macprop_t) - 1)) != 0)
goto done;
dipp = (dld_ioc_macprop_t *)mp->b_cont->b_rptr;
@@ -531,6 +535,37 @@ drv_ioc_prop_common(dld_ctl_str_t *ctls, mblk_t *mp, boolean_t set)
linkid = dipp->pr_linkid;
+ switch (dipp->pr_num) {
+ case MAC_PROP_ZONE:
+ if (set) {
+ dzp = (dld_ioc_zid_t *)dipp->pr_val;
+ err = dls_devnet_setzid(dzp->diz_link, dzp->diz_zid);
+ goto done;
+ } else {
+ cp = (uchar_t *)dipp->pr_val;
+ err = dls_devnet_getzid(linkid, (zoneid_t *)cp);
+ goto done;
+ }
+ case MAC_PROP_AUTOPUSH:
+ if (set) {
+ if (dipp->pr_valsize != 0) {
+ dlap = (struct dlautopush *)dipp->pr_val;
+ err = drv_ioc_setap(linkid, dlap);
+ goto done;
+ } else {
+ err = drv_ioc_clrap(linkid);
+ goto done;
+ }
+ } else {
+ dlap = (struct dlautopush *)dipp->pr_val;
+ err = drv_ioc_getap(linkid, dlap);
+ goto done;
+ }
+
+ default:
+ break;
+ }
+
if ((err = dls_devnet_hold_tmp(linkid, &dlh)) != 0)
goto done;
@@ -729,23 +764,14 @@ done:
miocnak(q, mp, 0, err);
}
-/*
- * DLDIOC_SETAUTOPUSH
- */
-static void
-drv_ioc_setap(dld_ctl_str_t *ctls, mblk_t *mp)
+static int
+drv_ioc_setap(datalink_id_t linkid, struct dlautopush *dlap)
{
- dld_ioc_ap_t *diap;
dld_ap_t *dap;
int i, err;
- queue_t *q = ctls->cs_wq;
mod_hash_key_t key;
- if ((err = miocpullup(mp, sizeof (dld_ioc_ap_t))) != 0)
- goto failed;
-
- diap = (dld_ioc_ap_t *)mp->b_cont->b_rptr;
- if (diap->dia_npush == 0 || diap->dia_npush > MAXAPUSH) {
+ if (dlap->dap_npush == 0 || dlap->dap_npush > MAXAPUSH) {
err = EINVAL;
goto failed;
}
@@ -753,14 +779,14 @@ drv_ioc_setap(dld_ctl_str_t *ctls, mblk_t *mp)
/*
* Validate that the specified list of modules exist.
*/
- for (i = 0; i < diap->dia_npush; i++) {
- if (fmodsw_find(diap->dia_aplist[i], FMODSW_LOAD) == NULL) {
+ for (i = 0; i < dlap->dap_npush; i++) {
+ if (fmodsw_find(dlap->dap_aplist[i], FMODSW_LOAD) == NULL) {
err = EINVAL;
goto failed;
}
}
- key = (mod_hash_key_t)(uintptr_t)diap->dia_linkid;
+ key = (mod_hash_key_t)(uintptr_t)linkid;
rw_enter(&dld_ap_hash_lock, RW_WRITER);
if (mod_hash_find(dld_ap_hashp, key, (mod_hash_val_t *)&dap) != 0) {
@@ -771,7 +797,7 @@ drv_ioc_setap(dld_ctl_str_t *ctls, mblk_t *mp)
goto failed;
}
- dap->da_linkid = diap->dia_linkid;
+ dap->da_linkid = linkid;
err = mod_hash_insert(dld_ap_hashp, key, (mod_hash_val_t)dap);
ASSERT(err == 0);
}
@@ -779,40 +805,29 @@ drv_ioc_setap(dld_ctl_str_t *ctls, mblk_t *mp)
/*
* Update the configuration.
*/
- dap->da_anchor = diap->dia_anchor;
- dap->da_npush = diap->dia_npush;
- for (i = 0; i < diap->dia_npush; i++) {
- (void) strlcpy(dap->da_aplist[i], diap->dia_aplist[i],
+ dap->da_anchor = dlap->dap_anchor;
+ dap->da_npush = dlap->dap_npush;
+ for (i = 0; i < dlap->dap_npush; i++) {
+ (void) strlcpy(dap->da_aplist[i], dlap->dap_aplist[i],
FMNAMESZ + 1);
}
rw_exit(&dld_ap_hash_lock);
- miocack(q, mp, 0, 0);
- return;
+ return (0);
failed:
- miocnak(q, mp, 0, err);
+ return (err);
}
-/*
- * DLDIOC_GETAUTOPUSH
- */
-static void
-drv_ioc_getap(dld_ctl_str_t *ctls, mblk_t *mp)
+static int
+drv_ioc_getap(datalink_id_t linkid, struct dlautopush *dlap)
{
- dld_ioc_ap_t *diap;
dld_ap_t *dap;
int i, err;
- queue_t *q = ctls->cs_wq;
-
- if ((err = miocpullup(mp, sizeof (dld_ioc_ap_t))) != 0)
- goto failed;
-
- diap = (dld_ioc_ap_t *)mp->b_cont->b_rptr;
rw_enter(&dld_ap_hash_lock, RW_READER);
if (mod_hash_find(dld_ap_hashp,
- (mod_hash_key_t)(uintptr_t)diap->dia_linkid,
+ (mod_hash_key_t)(uintptr_t)linkid,
(mod_hash_val_t *)&dap) != 0) {
err = ENOENT;
rw_exit(&dld_ap_hash_lock);
@@ -822,54 +837,38 @@ drv_ioc_getap(dld_ctl_str_t *ctls, mblk_t *mp)
/*
* Retrieve the configuration.
*/
- diap->dia_anchor = dap->da_anchor;
- diap->dia_npush = dap->da_npush;
+ dlap->dap_anchor = dap->da_anchor;
+ dlap->dap_npush = dap->da_npush;
for (i = 0; i < dap->da_npush; i++) {
- (void) strlcpy(diap->dia_aplist[i], dap->da_aplist[i],
+ (void) strlcpy(dlap->dap_aplist[i], dap->da_aplist[i],
FMNAMESZ + 1);
}
rw_exit(&dld_ap_hash_lock);
- miocack(q, mp, sizeof (dld_ioc_ap_t), 0);
- return;
+ return (0);
failed:
- miocnak(q, mp, 0, err);
+ return (err);
}
-/*
- * DLDIOC_CLRAUTOPUSH
- */
-static void
-drv_ioc_clrap(dld_ctl_str_t *ctls, mblk_t *mp)
+static int
+drv_ioc_clrap(datalink_id_t linkid)
{
- dld_ioc_ap_t *diap;
mod_hash_val_t val;
mod_hash_key_t key;
- int err;
- queue_t *q = ctls->cs_wq;
- if ((err = miocpullup(mp, sizeof (dld_ioc_ap_t))) != 0)
- goto done;
-
- diap = (dld_ioc_ap_t *)mp->b_cont->b_rptr;
- key = (mod_hash_key_t)(uintptr_t)diap->dia_linkid;
+ key = (mod_hash_key_t)(uintptr_t)linkid;
rw_enter(&dld_ap_hash_lock, RW_WRITER);
if (mod_hash_find(dld_ap_hashp, key, &val) != 0) {
rw_exit(&dld_ap_hash_lock);
- goto done;
+ return (0);
}
VERIFY(mod_hash_remove(dld_ap_hashp, key, &val) == 0);
kmem_free(val, sizeof (dld_ap_t));
rw_exit(&dld_ap_hash_lock);
-
-done:
- if (err == 0)
- miocack(q, mp, 0, 0);
- else
- miocnak(q, mp, 0, err);
+ return (0);
}
/*
@@ -896,52 +895,6 @@ done:
}
/*
- * DLDIOC_SETZID
- */
-static void
-drv_ioc_setzid(dld_ctl_str_t *ctls, mblk_t *mp)
-{
- queue_t *q = ctls->cs_wq;
- dld_ioc_setzid_t *dis;
- int err;
-
- if ((err = miocpullup(mp, sizeof (dld_ioc_setzid_t))) != 0)
- goto done;
-
- dis = (dld_ioc_setzid_t *)mp->b_cont->b_rptr;
- err = dls_devnet_setzid(dis->dis_link, dis->dis_zid);
-
-done:
- if (err == 0)
- miocack(q, mp, 0, 0);
- else
- miocnak(q, mp, 0, err);
-}
-
-/*
- * DLDIOC_GETZID
- */
-static void
-drv_ioc_getzid(dld_ctl_str_t *ctls, mblk_t *mp)
-{
- queue_t *q = ctls->cs_wq;
- dld_ioc_getzid_t *dig;
- int err;
-
- if ((err = miocpullup(mp, sizeof (dld_ioc_getzid_t))) != 0)
- goto done;
-
- dig = (dld_ioc_getzid_t *)mp->b_cont->b_rptr;
- err = dls_devnet_getzid(dig->dig_linkid, &dig->dig_zid);
-
-done:
- if (err == 0)
- miocack(q, mp, sizeof (dld_ioc_getzid_t), 0);
- else
- miocnak(q, mp, 0, err);
-}
-
-/*
* Process an IOCTL message received by the control node.
*/
static void
@@ -981,24 +934,9 @@ drv_ioc(dld_ctl_str_t *ctls, mblk_t *mp)
case DLDIOC_VLAN_ATTR:
drv_ioc_vlan_attr(ctls, mp);
return;
- case DLDIOC_SETAUTOPUSH:
- drv_ioc_setap(ctls, mp);
- return;
- case DLDIOC_GETAUTOPUSH:
- drv_ioc_getap(ctls, mp);
- return;
- case DLDIOC_CLRAUTOPUSH:
- drv_ioc_clrap(ctls, mp);
- return;
case DLDIOC_DOORSERVER:
drv_ioc_doorserver(ctls, mp);
return;
- case DLDIOC_SETZID:
- drv_ioc_setzid(ctls, mp);
- return;
- case DLDIOC_GETZID:
- drv_ioc_getzid(ctls, mp);
- return;
case DLDIOC_RENAME:
drv_ioc_rename(ctls, mp);
return;
diff --git a/usr/src/uts/common/sys/dld.h b/usr/src/uts/common/sys/dld.h
index b6178707f3..1af906c90b 100644
--- a/usr/src/uts/common/sys/dld.h
+++ b/usr/src/uts/common/sys/dld.h
@@ -26,8 +26,6 @@
#ifndef _SYS_DLD_H
#define _SYS_DLD_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Data-Link Driver (public header).
*/
@@ -178,15 +176,13 @@ typedef struct dld_ioc_delete_vlan {
datalink_id_t did_linkid;
} dld_ioc_delete_vlan_t;
-#define DLDIOC_SETAUTOPUSH (DLDIOC | 0x0d)
-#define DLDIOC_GETAUTOPUSH (DLDIOC | 0x0e)
-#define DLDIOC_CLRAUTOPUSH (DLDIOC | 0x0f)
-typedef struct dld_ioc_ap {
- datalink_id_t dia_linkid;
- uint_t dia_anchor;
- uint_t dia_npush;
- char dia_aplist[MAXAPUSH][FMNAMESZ+1];
-} dld_ioc_ap_t;
+/*
+ * The following constants have been removed, and the slots are open:
+ *
+ * #define DLDIOC_SETAUTOPUSH (DLDIOC | 0x0d)
+ * #define DLDIOC_GETAUTOPUSH (DLDIOC | 0x0e)
+ * #define DLDIOC_CLRAUTOPUSH (DLDIOC | 0x0f)
+ */
#define DLDIOC_DOORSERVER (DLDIOC | 0x10)
typedef struct dld_ioc_door {
@@ -201,21 +197,17 @@ typedef struct dld_ioc_rename {
} dld_ioc_rename_t;
/*
- * DLDIOC_SETZID sets the zoneid of a given link. It could cause a VLAN to be
- * implicitly created. Note that we will hold a reference for the given link
- * whenever it has a zoneid other than the global zone.
+ * The following constants have been removed, and the slots are open:
+ *
+ * #define DLDIOC_SETZID (DLDIOC | 0x12)
+ * #define DLDIOC_GETZID (DLDIOC | 0x13)
*/
-#define DLDIOC_SETZID (DLDIOC | 0x12)
-typedef struct dld_ioc_setzid {
- char dis_link[MAXLINKNAMELEN];
- zoneid_t dis_zid;
-} dld_ioc_setzid_t;
-
-#define DLDIOC_GETZID (DLDIOC | 0x13)
-typedef struct dld_ioc_getzid {
- datalink_id_t dig_linkid;
- zoneid_t dig_zid;
-} dld_ioc_getzid_t;
+
+typedef struct dld_ioc_zid {
+ zoneid_t diz_zid;
+ char diz_link[MAXLINKNAMELEN];
+ boolean_t diz_is_ppa_hack;
+} dld_ioc_zid_t;
/*
* data-link autopush configuration.
diff --git a/usr/src/uts/common/sys/mac.h b/usr/src/uts/common/sys/mac.h
index e314da779f..bc930dfce2 100644
--- a/usr/src/uts/common/sys/mac.h
+++ b/usr/src/uts/common/sys/mac.h
@@ -26,8 +26,6 @@
#ifndef _SYS_MAC_H
#define _SYS_MAC_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
@@ -116,6 +114,8 @@ typedef enum {
MAC_PROP_AUTONEG,
MAC_PROP_EN_AUTONEG,
MAC_PROP_MTU,
+ MAC_PROP_ZONE,
+ MAC_PROP_AUTOPUSH,
MAC_PROP_FLOWCTRL,
MAC_PROP_ADV_1000FDX_CAP,
MAC_PROP_EN_1000FDX_CAP,