d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The contents of this file are subject to the terms of the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Common Development and Distribution License (the "License").
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You may not use this file except in compliance with the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When distributing Covered Code, include this CDDL HEADER in each
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If applicable, add the following below this CDDL HEADER, with the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * fields enclosed by brackets "[]" replaced with your own identifying
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * information: Portions Copyright [yyyy] [name of copyright owner]
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER END
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Use is subject to license terms.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * vnode ops for the /dev/net directory
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The lookup is based on the internal vanity naming node table. We also
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * override readdir in order to delete net nodes no longer in-use.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Check if a net sdev_node is still valid - i.e. it represents a current
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * network link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This serves two purposes
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - only valid net nodes are returned during lookup() and readdir().
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * - since net sdev_nodes are not actively destroyed when a network link
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * goes away, we use the validator to do deferred cleanup i.e. when such
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * nodes are encountered during subsequent lookup() and readdir().
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (dls_mgmt_get_linkid(dv->sdev_name, &linkid) != 0)
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy return (zone_check_datalink(&zoneid, linkid) == 0 ?
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This callback is invoked from devname_lookup_func() to create
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * a net entry when the node is not found in the cache.
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdevnet_create_rvp(const char *nm, struct vattr *vap, dls_dl_handle_t *ddhp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sdcmn_err12(("devnet_create_rvp: not a valid vanity name "
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This is a valid network device (at least at this point in time).
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Create the node by setting the attribute; the rest is taken care
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * of by devname_lookup_func().
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Lookup for /dev/net directory
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If the entry does not exist, the devnet_create_rvp() callback
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * is invoked to create it. Nodes do not persist across reboot.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*ARGSUSED3*/
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdevnet_lookup(struct vnode *dvp, char *nm, struct vnode **vpp,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz struct pathname *pnp, int flags, struct vnode *rdir, struct cred *cred,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz caller_context_t *ct, int *direntflags, pathname_t *realpnp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Empty name or ., return node itself.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * .., return the parent directory
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * directory cache lookup:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * ZOMBIED parent does not allow new node creation, bail out early.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz error = sdev_mknode(ddv, nm, &dv, &vattr, NULL, NULL, cred, SDEV_READY);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (error != 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * SDEV_ATTR_INVALID means that this device has been
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * detached, and its dev_t might've been changed too.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Therefore, sdev_node's 'vattr' needs to be updated.
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roydevnet_filldir_datalink(datalink_id_t linkid, void *arg)
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (dls_mgmt_get_linkinfo(linkid, link, NULL, NULL, NULL) != 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (sdev_mknode(ddv, (char *)link, &dv, &vattr, NULL, NULL, kcred,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * As there is no reference holding the network device, it could be
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * detached. Set SDEV_ATTR_INVALID so that the 'vattr' will be updated
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic void
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /* validate and prune only ready nodes */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /* remove the cache node */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (((ddv->sdev_flags & SDEV_BUILD) == 0) && !dls_devnet_rebuild())
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Display all instantiated network datalink device nodes.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * A /dev/net entry will be created only after the first lookup of
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the network datalink device succeeds.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*ARGSUSED4*/
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdevnet_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This callback is invoked from devname_inactive_func() to release
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the net entry which was held in devnet_create_rvp().
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic void
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * "ddh" (sdev_private) could be NULL if devnet_lookup fails.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*ARGSUSED*/
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic void
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdevnet_inactive(struct vnode *dvp, struct cred *cred, caller_context_t *ct)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz devname_inactive_func(dvp, cred, devnet_inactive_callback);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * We override lookup and readdir to build entries based on the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * in kernel vanity naming node table.