rds_ioctl.c revision e11c3f44f531fdff80941ce57c065d2ae861cefc
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License (the "License").
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sin_t sin_null; /* Zero address for quick clears */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Just pass the ioctl to IP and the result to the caller.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP, &kvp) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (t_kopen((file_t *)NULL, kvp->v_rdev, FREAD|FWRITE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check if the IP interface named by `lifrp' is RDS-capable.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Strip off the logical interface portion before getting
03831d35f7499c87d51205817c93e9a8d42c4baestevel * intimate with the name.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * loopback is considered RDS-capable
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (ddi_parse(ifname, drv, &ppa) == DDI_SUCCESS &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel rds_transport_ops->rds_transport_if_lookup_by_name(drv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Issue an SIOCGLIFCONF down to IP and return the result in `lifcp'.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * lifcp->lifc_buf is dynamically allocated to be *bufsizep bytes.
f500b19684bd0346ac05bec02a50af07f369da1aRichard Beanrds_do_lifconf(struct lifconf *lifcp, uint_t *bufsizep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err = rds_do_ip_ioctl(SIOCGIFNUM, sizeof (int), &nifs)) != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Pad the interface count to account for additional interfaces that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * may have been configured between the SIOCGLIFNUM and SIOCGLIFCONF.
03831d35f7499c87d51205817c93e9a8d42c4baestevel lifcp->lifc_len = *bufsizep = (nifs * sizeof (struct lifreq));
03831d35f7499c87d51205817c93e9a8d42c4baestevel lifcp->lifc_buf = kmem_zalloc(*bufsizep, KM_NOSLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = rds_do_ip_ioctl(SIOCGLIFCONF, sizeof (struct lifconf), lifcp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (lifrp = lifc.lifc_req, i = 0; i < nifs; i++, lifrp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel STRUCT_SET_HANDLE(ifc, iocp->ioc_flag, (struct ifconf *)addr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mp1 = mi_copyout_alloc(q, mp, ubuf_addr, ubuf_size, B_FALSE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel MBLKTAIL(mp1) >= sizeof (struct ifreq); i++, lifrp++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip entries that are impossible to return with
03831d35f7499c87d51205817c93e9a8d42c4baestevel * SIOCGIFCONF, or not RDS-capable.
03831d35f7499c87d51205817c93e9a8d42c4baestevel ifrp->ifr_addr = *(struct sockaddr *)&lifrp->lifr_addr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel err = rds_do_ip_ioctl(iocp->ioc_cmd, sizeof (struct ifreq),
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((struct iocblk *)(uintptr_t)mp->b_rptr)->ioc_flag, addr);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mp1 = mi_copyout_alloc(q, mp, STRUCT_FGETP(sb, buf), addrlen,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (err == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct iocblk *iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;
03831d35f7499c87d51205817c93e9a8d42c4baestevel copyin_size = sizeof (int);
f500b19684bd0346ac05bec02a50af07f369da1aRichard Bean struct iocblk *iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;