rds_ioctl.c revision c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The contents of this file are subject to the terms of the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Common Development and Distribution License (the "License").
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You may not use this file except in compliance with the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * When distributing Covered Code, include this CDDL HEADER in each
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If applicable, add the following below this CDDL HEADER, with the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * fields enclosed by brackets "[]" replaced with your own identifying
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * information: Portions Copyright [yyyy] [name of copyright owner]
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER END
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#pragma ident "%Z%%M% %I% %E% SMI"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic sin_t sin_null; /* Zero address for quick clears */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Just pass the ioctl to IP and the result to the caller.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (t_kopen((file_t *)NULL, kvp->v_rdev, FREAD|FWRITE,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((mp = allocb(sizeof (dl_info_req_t), BPRI_MED)) == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((error = ldi_getmsg(lh, &mp, (timestruc_t *)NULL)) != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri dl_prim = (union DL_primitives *)(uintptr_t)mp->b_rptr;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Return 0 if the interface is IB.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Return error (>0) if any error is encountered during processing.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Return -1 if the interface is not IB and no error.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ibd devices are only style 2 devices
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * so we will open only style 2 devices
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * by ignoring the ppa
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (i == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * null name.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * loopback interface is considered RDS capable
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) strncat((dev_path + sizeof ("/dev/") -1), name, i);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ldi_open_by_name(dev_path, FREAD|FWRITE, kcred, &lh, rds_li);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if (ret != 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri !rds_transport_ops->rds_transport_if_lookup_by_name(name)) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (-1);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct iocblk *iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Get number of interfaces. */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (err != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (err != 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if (err == 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri } else if (err > 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (err != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (err != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mp1 = mi_copyout_alloc(q, mp, ubuf_addr, ubuf_size, B_FALSE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (; num_ifs > 0 &&
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (int)((uintptr_t)mp1->b_wptr - (uintptr_t)mp1->b_rptr) <
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if (err == 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri } else if (err > 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri STRUCT_FSET(ifc, ifc_len, (int)((uintptr_t)mp1->b_wptr -
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mp1 = mi_copyout_alloc(q, mp, STRUCT_FGETP(sb, buf), addrlen,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (err == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct iocblk *iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri copyin_size = sizeof (int);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct iocblk *iocp = (struct iocblk *)(uintptr_t)mp->b_rptr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_do_ip_ioctl(SIOCGIFNUM, sizeof (int), (caddr_t)&numifs)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_do_ip_ioctl(SIOCGIFCONF, sizeof (struct ifconf),
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sin = (struct sockaddr_in *)(uintptr_t)&ifr->ifr_addr;