diff options
author | yz147064 <none@none> | 2007-12-20 19:52:58 -0800 |
---|---|---|
committer | yz147064 <none@none> | 2007-12-20 19:52:58 -0800 |
commit | a08fa175a5f2205c2ca6df8da5595b44b965265b (patch) | |
tree | baf91c5c07976d520f5716e089d2a0fd0e891770 | |
parent | c36fc3365c8ef629c99a28be2838084646c30c33 (diff) | |
download | illumos-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.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/io/dls/dls.c | 8 | ||||
-rw-r--r-- | usr/src/uts/common/io/dls/dls_link.c | 17 | ||||
-rw-r--r-- | usr/src/uts/common/io/dls/dls_vlan.c | 17 | ||||
-rw-r--r-- | usr/src/uts/common/io/mac/mac.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/io/strplumb.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/vnic/vnic_dev.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls_impl.h | 8 | ||||
-rw-r--r-- | usr/src/uts/common/sys/mac.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/xen/io/xnbo.c | 10 | ||||
-rw-r--r-- | usr/src/uts/sun4v/io/vsw_phys.c | 21 |
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 |