summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryz147064 <none@none>2007-12-20 19:52:58 -0800
committeryz147064 <none@none>2007-12-20 19:52:58 -0800
commita08fa175a5f2205c2ca6df8da5595b44b965265b (patch)
treebaf91c5c07976d520f5716e089d2a0fd0e891770
parentc36fc3365c8ef629c99a28be2838084646c30c33 (diff)
downloadillumos-joyent-a08fa175a5f2205c2ca6df8da5595b44b965265b.tar.gz
PSARC 2007/646 Nemo MAC client updates
6516337 mac_open() shouldn't require an instance argument 6600940 dl_txloop field in dls_link_t not needed 6604687 snoop is not working on trunked interfaces with vlans 6615598 vnic_info() returns wrong error code even when it finds the right VNIC
-rw-r--r--usr/src/uts/common/io/aggr/aggr_port.c7
-rw-r--r--usr/src/uts/common/io/dls/dls.c8
-rw-r--r--usr/src/uts/common/io/dls/dls_link.c17
-rw-r--r--usr/src/uts/common/io/dls/dls_vlan.c17
-rw-r--r--usr/src/uts/common/io/mac/mac.c9
-rw-r--r--usr/src/uts/common/io/strplumb.c2
-rw-r--r--usr/src/uts/common/io/vnic/vnic_dev.c9
-rw-r--r--usr/src/uts/common/sys/dls.h2
-rw-r--r--usr/src/uts/common/sys/dls_impl.h8
-rw-r--r--usr/src/uts/common/sys/mac.h2
-rw-r--r--usr/src/uts/common/xen/io/xnbo.c10
-rw-r--r--usr/src/uts/sun4v/io/vsw_phys.c21
12 files changed, 32 insertions, 80 deletions
diff --git a/usr/src/uts/common/io/aggr/aggr_port.c b/usr/src/uts/common/io/aggr/aggr_port.c
index ffc509021e..0beb8f364e 100644
--- a/usr/src/uts/common/io/aggr/aggr_port.c
+++ b/usr/src/uts/common/io/aggr/aggr_port.c
@@ -135,15 +135,10 @@ aggr_port_create(const char *name, aggr_port_t **pp)
uint16_t portid;
uint_t i;
const mac_info_t *mip;
- char driver[MAXNAMELEN];
- uint_t ddi_instance;
*pp = NULL;
- if (ddi_parse(name, driver, &ddi_instance) != DDI_SUCCESS)
- return (EINVAL);
-
- if ((err = mac_open(name, ddi_instance, &mh)) != 0)
+ if ((err = mac_open(name, &mh)) != 0)
return (err);
mip = mac_info(mh);
diff --git a/usr/src/uts/common/io/dls/dls.c b/usr/src/uts/common/io/dls/dls.c
index a5799dd74d..0e9089dff0 100644
--- a/usr/src/uts/common/io/dls/dls.c
+++ b/usr/src/uts/common/io/dls/dls.c
@@ -168,9 +168,9 @@ dls_fini(void)
*/
int
-dls_create(const char *linkname, const char *macname, uint_t ddi_instance)
+dls_create(const char *linkname, const char *macname)
{
- return (dls_vlan_create(linkname, macname, ddi_instance, 0));
+ return (dls_vlan_create(linkname, macname, 0));
}
int
@@ -451,7 +451,7 @@ dls_promisc(dls_channel_t dc, uint32_t flags)
multi:
/*
- * It's easiest to add the txloop handler up-front; if promiscuous
+ * It's easiest to add the txloop callback up-front; if promiscuous
* mode cannot be enabled, then we'll remove it before returning.
* Use dl_promisc_lock to prevent racing with another thread also
* manipulating the promiscuous state on another dls_impl_t associated
@@ -460,7 +460,7 @@ multi:
mutex_enter(&dlp->dl_promisc_lock);
if ((dlp->dl_npromisc == 0) && (flags & DLS_PROMISC_PHYS)) {
ASSERT(dlp->dl_mth == NULL);
- dlp->dl_mth = mac_txloop_add(dlp->dl_mh, dlp->dl_txloop, dlp);
+ dlp->dl_mth = mac_txloop_add(dlp->dl_mh, dls_link_txloop, dlp);
}
/*
diff --git a/usr/src/uts/common/io/dls/dls_link.c b/usr/src/uts/common/io/dls/dls_link.c
index 15d0ccbf97..e342c95955 100644
--- a/usr/src/uts/common/io/dls/dls_link.c
+++ b/usr/src/uts/common/io/dls/dls_link.c
@@ -690,8 +690,8 @@ i_dls_link_rx_promisc(void *arg, mac_resource_handle_t mrh, mblk_t *mp)
i_dls_link_rx_common(arg, mrh, mp, dls_accept);
}
-static void
-i_dls_link_txloop(void *arg, mblk_t *mp)
+void
+dls_link_txloop(void *arg, mblk_t *mp)
{
i_dls_link_rx_common(arg, NULL, mp, dls_accept_loopback);
}
@@ -712,7 +712,7 @@ i_dls_link_walk(mod_hash_key_t key, mod_hash_val_t *val, void *arg)
}
static int
-i_dls_link_create(const char *name, uint_t ddi_instance, dls_link_t **dlpp)
+i_dls_link_create(const char *name, dls_link_t **dlpp)
{
dls_link_t *dlp;
@@ -725,13 +725,10 @@ i_dls_link_create(const char *name, uint_t ddi_instance, dls_link_t **dlpp)
* Name the dls_link_t after the MAC interface it represents.
*/
(void) strlcpy(dlp->dl_name, name, sizeof (dlp->dl_name));
- dlp->dl_ddi_instance = ddi_instance;
/*
- * Set the packet loopback function for use when the MAC is in
- * promiscuous mode, and initialize promiscuous bookeeping fields.
+ * Initialize promiscuous bookkeeping fields.
*/
- dlp->dl_txloop = i_dls_link_txloop;
dlp->dl_npromisc = 0;
dlp->dl_mth = NULL;
@@ -807,7 +804,7 @@ dls_link_fini(void)
*/
int
-dls_link_hold(const char *name, uint_t ddi_instance, dls_link_t **dlpp)
+dls_link_hold(const char *name, dls_link_t **dlpp)
{
dls_link_t *dlp;
int err;
@@ -828,7 +825,7 @@ dls_link_hold(const char *name, uint_t ddi_instance, dls_link_t **dlpp)
/*
* We didn't find anything so we need to create one.
*/
- if ((err = i_dls_link_create(name, ddi_instance, &dlp)) != 0) {
+ if ((err = i_dls_link_create(name, &dlp)) != 0) {
rw_exit(&i_dls_link_lock);
return (err);
}
@@ -898,7 +895,7 @@ dls_mac_hold(dls_link_t *dlp)
/*
* First reference; hold open the MAC interface.
*/
- err = mac_open(dlp->dl_name, dlp->dl_ddi_instance, &dlp->dl_mh);
+ err = mac_open(dlp->dl_name, &dlp->dl_mh);
if (err != 0)
goto done;
diff --git a/usr/src/uts/common/io/dls/dls_vlan.c b/usr/src/uts/common/io/dls/dls_vlan.c
index 9d98659e50..2fcf435a3d 100644
--- a/usr/src/uts/common/io/dls/dls_vlan.c
+++ b/usr/src/uts/common/io/dls/dls_vlan.c
@@ -144,8 +144,7 @@ dls_vlan_fini(void)
*/
int
-dls_vlan_create(const char *vlanname, const char *macname, uint_t ddi_instance,
- uint16_t vid)
+dls_vlan_create(const char *vlanname, const char *macname, uint16_t vid)
{
dls_link_t *dlp;
dls_vlan_t *dvp;
@@ -168,7 +167,7 @@ dls_vlan_create(const char *vlanname, const char *macname, uint_t ddi_instance,
* Get a reference to a dls_link_t representing the MAC. This call
* will create one if necessary.
*/
- if ((err = dls_link_hold(macname, ddi_instance, &dlp)) != 0)
+ if ((err = dls_link_hold(macname, &dlp)) != 0)
return (err);
/*
@@ -262,7 +261,7 @@ dls_vlan_hold(const char *name, dls_vlan_t **dvpp, boolean_t create_vlan)
dls_link_t *dlp;
boolean_t vlan_created = B_FALSE;
uint16_t vid;
- uint_t ddi_inst;
+ uint_t mac_ppa;
again:
rw_enter(&i_dls_vlan_lock, RW_WRITER);
@@ -271,7 +270,7 @@ again:
(mod_hash_val_t *)&dvp);
if (err != 0) {
char mac[MAXNAMELEN];
- uint_t index, mac_ppa, len;
+ uint_t index, len;
ASSERT(err == MH_ERR_NOTFOUND);
@@ -295,17 +294,13 @@ again:
}
mac_ppa = (uint_t)DLS_PPA2INST(index);
- if (strcmp(mac, "aggr") == 0)
- ddi_inst = 0;
- else
- ddi_inst = mac_ppa;
len = strlen(mac);
ASSERT(len < MAXNAMELEN);
(void) snprintf(mac + len, MAXNAMELEN - len, "%d", mac_ppa);
rw_exit(&i_dls_vlan_lock);
- if ((err = dls_vlan_create(name, mac, ddi_inst, vid)) != 0) {
+ if ((err = dls_vlan_create(name, mac, vid)) != 0) {
rw_enter(&i_dls_vlan_lock, RW_WRITER);
goto done;
}
@@ -329,7 +324,7 @@ again:
if (vid != 0 && vlan_created) {
/* A tagged VLAN */
dvp->dv_minor = dls_minor_hold(B_TRUE);
- dvp->dv_ppa = DLS_VIDINST2PPA(vid, ddi_inst);
+ dvp->dv_ppa = DLS_VIDINST2PPA(vid, mac_ppa);
err = mod_hash_insert(i_dls_vlan_dev_hash,
(mod_hash_key_t)(uintptr_t)dvp->dv_minor,
diff --git a/usr/src/uts/common/io/mac/mac.c b/usr/src/uts/common/io/mac/mac.c
index 1f3cf48bfa..d093353ba3 100644
--- a/usr/src/uts/common/io/mac/mac.c
+++ b/usr/src/uts/common/io/mac/mac.c
@@ -380,10 +380,10 @@ mac_fini(void)
*/
int
-mac_open(const char *macname, uint_t ddi_instance, mac_handle_t *mhp)
+mac_open(const char *macname, mac_handle_t *mhp)
{
char driver[MAXNAMELEN];
- uint_t instance;
+ uint_t ddi_instance;
major_t major;
dev_info_t *dip;
mac_impl_t *mip;
@@ -399,7 +399,7 @@ mac_open(const char *macname, uint_t ddi_instance, mac_handle_t *mhp)
/*
* Split the device name into driver and instance components.
*/
- if (ddi_parse(macname, driver, &instance) != DDI_SUCCESS)
+ if (ddi_parse(macname, driver, &ddi_instance) != DDI_SUCCESS)
return (EINVAL);
if ((strcmp(driver, "aggr") == 0) || (strcmp(driver, "vnic") == 0))
@@ -1422,8 +1422,7 @@ mac_register(mac_register_t *mregp, mac_handle_t *mhp)
* Create a link for this MAC. The link name will be the same as
* the MAC name.
*/
- err = dls_create(mip->mi_name, mip->mi_name,
- ddi_get_instance(mip->mi_dip));
+ err = dls_create(mip->mi_name, mip->mi_name);
if (err != 0)
goto fail;
diff --git a/usr/src/uts/common/io/strplumb.c b/usr/src/uts/common/io/strplumb.c
index d6e735d829..644d83c352 100644
--- a/usr/src/uts/common/io/strplumb.c
+++ b/usr/src/uts/common/io/strplumb.c
@@ -757,7 +757,7 @@ getmacaddr_gldv3(char *drv, int inst, int *maclenp)
uchar_t *macaddr;
(void) snprintf(ifname, sizeof (ifname), "%s%d", drv, inst);
- if (mac_open(ifname, inst, &mh) < 0) {
+ if (mac_open(ifname, &mh) < 0) {
return (NULL);
}
*maclenp = sizeof (struct ether_addr);
diff --git a/usr/src/uts/common/io/vnic/vnic_dev.c b/usr/src/uts/common/io/vnic/vnic_dev.c
index 76a761bca6..2433e499b0 100644
--- a/usr/src/uts/common/io/vnic/vnic_dev.c
+++ b/usr/src/uts/common/io/vnic/vnic_dev.c
@@ -200,15 +200,10 @@ vnic_mac_open(const char *dev_name, vnic_mac_t **vmp)
char *str_key;
int err;
vnic_mac_t *vnic_mac = NULL;
- char driver[MAXNAMELEN];
- uint_t ddi_instance;
const mac_info_t *mip;
*vmp = NULL;
- if (ddi_parse(dev_name, driver, &ddi_instance) != DDI_SUCCESS)
- return (EINVAL);
-
mutex_enter(&vnic_mac_lock);
err = mod_hash_find(vnic_mac_hash, (mod_hash_key_t)dev_name,
@@ -223,7 +218,7 @@ vnic_mac_open(const char *dev_name, vnic_mac_t **vmp)
vnic_mac = kmem_cache_alloc(vnic_mac_cache, KM_SLEEP);
- if ((err = mac_open(dev_name, ddi_instance, &vnic_mac->va_mh)) != 0) {
+ if ((err = mac_open(dev_name, &vnic_mac->va_mh)) != 0) {
vnic_mac->va_mh = NULL;
goto bail;
}
@@ -1353,7 +1348,7 @@ vnic_info(uint_t *nvnics, uint32_t vnic_id, char *dev_name, void *fn_arg,
mod_hash_walk(vnic_hash, vnic_info_walker, &state);
if ((rc = state.vs_rc) == 0 && vnic_id != 0 &&
- state.vs_vnic_found)
+ !state.vs_vnic_found)
rc = ENOENT;
rw_exit(&vnic_lock);
diff --git a/usr/src/uts/common/sys/dls.h b/usr/src/uts/common/sys/dls.h
index ebaed461a5..77bf2c1e58 100644
--- a/usr/src/uts/common/sys/dls.h
+++ b/usr/src/uts/common/sys/dls.h
@@ -69,7 +69,7 @@ extern "C" {
#ifdef _KERNEL
-extern int dls_create(const char *, const char *, uint_t);
+extern int dls_create(const char *, const char *);
extern int dls_destroy(const char *);
typedef struct dls_t *dls_channel_t;
diff --git a/usr/src/uts/common/sys/dls_impl.h b/usr/src/uts/common/sys/dls_impl.h
index ca7c56fbfe..c2a2dcf24c 100644
--- a/usr/src/uts/common/sys/dls_impl.h
+++ b/usr/src/uts/common/sys/dls_impl.h
@@ -52,7 +52,6 @@ typedef struct dls_link_s dls_link_t;
struct dls_link_s {
char dl_name[MAXNAMELEN];
- uint_t dl_ddi_instance;
mac_handle_t dl_mh;
const mac_info_t *dl_mip;
mac_rx_handle_t dl_mrh;
@@ -62,7 +61,6 @@ struct dls_link_s {
mod_hash_t *dl_impl_hash;
krwlock_t dl_impl_lock;
uint_t dl_impl_count;
- mac_txloop_t dl_txloop;
kmutex_t dl_promisc_lock;
uint_t dl_npromisc;
uint_t dl_nactive;
@@ -118,7 +116,7 @@ struct dls_head_s {
extern void dls_link_init(void);
extern int dls_link_fini(void);
-extern int dls_link_hold(const char *, uint_t, dls_link_t **);
+extern int dls_link_hold(const char *, dls_link_t **);
extern void dls_link_rele(dls_link_t *);
extern void dls_link_add(dls_link_t *, uint32_t, dls_impl_t *);
extern void dls_link_remove(dls_link_t *, dls_impl_t *);
@@ -132,8 +130,7 @@ extern void dls_mac_stat_destroy(dls_vlan_t *);
extern void dls_vlan_init(void);
extern int dls_vlan_fini(void);
-extern int dls_vlan_create(const char *, const char *, uint_t,
- uint16_t);
+extern int dls_vlan_create(const char *, const char *, uint16_t);
extern int dls_vlan_destroy(const char *);
extern int dls_vlan_hold(const char *, dls_vlan_t **, boolean_t);
extern void dls_vlan_rele(dls_vlan_t *);
@@ -150,6 +147,7 @@ extern void dls_vlan_remove_impl(dls_vlan_t *, dls_impl_t *);
extern void dls_init(void);
extern int dls_fini(void);
+extern void dls_link_txloop(void *, mblk_t *);
extern boolean_t dls_accept(dls_impl_t *, mac_header_info_t *,
dls_rx_t *, void **);
extern boolean_t dls_accept_loopback(dls_impl_t *, mac_header_info_t *,
diff --git a/usr/src/uts/common/sys/mac.h b/usr/src/uts/common/sys/mac.h
index 894a9b15b1..63d7ff42a0 100644
--- a/usr/src/uts/common/sys/mac.h
+++ b/usr/src/uts/common/sys/mac.h
@@ -492,7 +492,7 @@ typedef struct mactype_register_s {
/*
* Client interface functions.
*/
-extern int mac_open(const char *, uint_t, mac_handle_t *);
+extern int mac_open(const char *, mac_handle_t *);
extern void mac_close(mac_handle_t);
extern const mac_info_t *mac_info(mac_handle_t);
extern boolean_t mac_info_get(const char *, mac_info_t *);
diff --git a/usr/src/uts/common/xen/io/xnbo.c b/usr/src/uts/common/xen/io/xnbo.c
index 31a2056bdb..a7d2190cda 100644
--- a/usr/src/uts/common/xen/io/xnbo.c
+++ b/usr/src/uts/common/xen/io/xnbo.c
@@ -241,8 +241,6 @@ static boolean_t
xnbo_open_mac(xnb_t *xnbp, char *mac)
{
xnbo_t *xnbop = xnbp->x_flavour_data;
- char drv[LIFNAMSIZ];
- uint_t ddi_instance;
int err, need_rx_filter, need_setphysaddr, need_promiscuous;
const mac_info_t *mi;
char *xsname;
@@ -250,13 +248,7 @@ xnbo_open_mac(xnb_t *xnbp, char *mac)
xsname = xvdi_get_xsname(xnbp->x_devinfo);
- if (ddi_parse(mac, drv, &ddi_instance) != DDI_SUCCESS) {
- cmn_err(CE_WARN, "xnbo_hotplug: "
- "invalid device name %s", mac);
- return (B_FALSE);
- }
-
- if ((err = mac_open(mac, ddi_instance, &xnbop->o_mh)) != 0) {
+ if ((err = mac_open(mac, &xnbop->o_mh)) != 0) {
cmn_err(CE_WARN, "xnbo_open_mac: "
"cannot open mac device %s (%d)", mac, err);
return (B_FALSE);
diff --git a/usr/src/uts/sun4v/io/vsw_phys.c b/usr/src/uts/sun4v/io/vsw_phys.c
index 29f0de6393..c5c909e2bc 100644
--- a/usr/src/uts/sun4v/io/vsw_phys.c
+++ b/usr/src/uts/sun4v/io/vsw_phys.c
@@ -314,8 +314,6 @@ vsw_unset_addrs(vsw_t *vswp)
int
vsw_mac_open(vsw_t *vswp)
{
- char drv[LIFNAMSIZ];
- uint_t ddi_instance;
int rv;
ASSERT(MUTEX_HELD(&vswp->mac_lock));
@@ -330,24 +328,7 @@ vsw_mac_open(vsw_t *vswp)
return (EIO);
}
- if (ddi_parse(vswp->physname, drv, &ddi_instance) != DDI_SUCCESS) {
- cmn_err(CE_WARN, "!vsw%d: invalid device name: %s",
- vswp->instance, vswp->physname);
- return (EIO);
- }
-
- /*
- * Aggregation devices are special in that the device instance
- * must be set to zero when they are being mac_open()'ed.
- *
- * The only way to determine if we are being passed an aggregated
- * device is to check the device name.
- */
- if (strcmp(drv, "aggr") == 0) {
- ddi_instance = 0;
- }
-
- rv = mac_open(vswp->physname, ddi_instance, &vswp->mh);
+ rv = mac_open(vswp->physname, &vswp->mh);
if (rv != 0) {
/*
* If mac_open() failed and the error indicates that the