ibcm_arp.c revision 1cfa752f4e24c34133009b0f6c139127a5c461de
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * CDDL HEADER START
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * The contents of this file are subject to the terms of the
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Common Development and Distribution License (the "License").
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * You may not use this file except in compliance with the License.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * or http://www.opensolaris.org/os/licensing.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * See the License for the specific language governing permissions
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * and limitations under the License.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * When distributing Covered Code, include this CDDL HEADER in each
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * If applicable, add the following below this CDDL HEADER, with the
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * fields enclosed by brackets "[]" replaced with your own identifying
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * CDDL HEADER END
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
b98131cff90a91303826565dacf89c46a422e6c5Eric Taylor * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/types.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/ddi.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/sunddi.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/strsubr.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/socket.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <net/if_arp.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <net/if_types.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/sockio.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/pathname.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/ib/mgt/ibcm/ibcm_arp.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/kstr.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/t_kuser.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/dls.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockextern char cmlog[];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockextern int ibcm_resolver_pr_lookup(ibcm_arp_streams_t *ib_s,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibt_ip_addr_t *dst_addr, ibt_ip_addr_t *src_addr, zoneid_t myzoneid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockextern void ibcm_arp_delete_prwqn(ibcm_arp_prwqn_t *wqnp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibt_ip_addr_s))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_ip_t))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_ibd_insts_t))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_prwqn_t))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", sockaddr_in))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_NOTE(SCHEME_PROTECTS_DATA("Unshared data", sockaddr_in6))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockint ibcm_printip = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Function:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * ibcm_ip_print
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Input:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * label Arbitrary qualifying string
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * ipa Pointer to IP Address to print
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockvoid
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_ip_print(char *label, ibt_ip_addr_t *ipaddr)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char buf[INET6_ADDRSTRLEN];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ipaddr->family == AF_INET) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "%s: %s", label,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock inet_ntop(AF_INET, &ipaddr->un.ip4addr, buf, sizeof (buf)));
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor } else if (ipaddr->family == AF_INET6) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "%s: %s", label, inet_ntop(AF_INET6,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &ipaddr->un.ip6addr, buf, sizeof (buf)));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L2(cmlog, "%s: IP ADDR NOT SPECIFIED ", label);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
b98131cff90a91303826565dacf89c46a422e6c5Eric Taylor}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibt_status_t
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibaddr(zoneid_t myzoneid, ibt_ip_addr_t srcaddr,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibt_ip_addr_t destaddr, ib_gid_t *sgid, ib_gid_t *dgid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibt_ip_addr_t *saddrp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_streams_t *ib_s;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_prwqn_t *wqnp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int ret = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int len;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr(%d, %p, %p, %p, %p, %p)",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock myzoneid, srcaddr, destaddr, sgid, dgid, saddrp);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor ib_s = (ibcm_arp_streams_t *)kmem_zalloc(sizeof (ibcm_arp_streams_t),
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor KM_SLEEP);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_init(&ib_s->lock, NULL, MUTEX_DEFAULT, NULL);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor cv_init(&ib_s->cv, NULL, CV_DRIVER, NULL);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_enter(&ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor ib_s->done = B_FALSE;
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_exit(&ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor ret = ibcm_resolver_pr_lookup(ib_s, &destaddr, &srcaddr, myzoneid);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: ibcm_resolver_pr_lookup "
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor "returned: %d", ret);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (ret == 0) {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_enter(&ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor while (ib_s->done != B_TRUE)
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor cv_wait(&ib_s->cv, &ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_exit(&ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor }
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_enter(&ib_s->lock);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor wqnp = ib_s->wqnp;
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (ib_s->status == 0) {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (sgid)
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor *sgid = wqnp->sgid;
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (dgid)
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor *dgid = wqnp->dgid;
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor /*
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor * If the user supplied a address, then verify we got
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor * for the same address.
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor */
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (wqnp->usrc_addr.family && sgid) {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor len = (wqnp->usrc_addr.family == AF_INET) ?
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IP_ADDR_LEN : sizeof (in6_addr_t);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (bcmp(&wqnp->usrc_addr.un,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &wqnp->src_addr.un, len)) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "srcaddr mismatch");
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* Clean-up old data, and reset the done flag */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_delete_prwqn(wqnp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ib_s->done = B_FALSE;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_exit(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ret = ibcm_resolver_pr_lookup(ib_s, &srcaddr,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &srcaddr, myzoneid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ret == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_enter(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock while (ib_s->done != B_TRUE)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cv_wait(&ib_s->cv, &ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_exit(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_enter(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock wqnp = ib_s->wqnp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ib_s->status == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (sgid)
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock *sgid = wqnp->dgid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (saddrp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bcopy(&wqnp->src_addr, saddrp,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (ibt_ip_addr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog,
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock "ibcm_arp_get_ibaddr: "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "SGID: %llX:%llX DGID: %llX:%llX",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sgid->gid_prefix, sgid->gid_guid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock dgid->gid_prefix, dgid->gid_guid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_delete_prwqn(wqnp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else if (ret == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (wqnp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock kmem_free(wqnp,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (ibcm_arp_prwqn_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock goto arp_ibaddr_done;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (saddrp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bcopy(&wqnp->src_addr, saddrp, sizeof (ibt_ip_addr_t));
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr: SGID: %llX:%llX"
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock " DGID: %llX:%llX", sgid->gid_prefix, sgid->gid_guid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock dgid->gid_prefix, dgid->gid_guid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_delete_prwqn(wqnp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else if (ret == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * We come here only when lookup has returned empty (failed)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * via callback routine.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * i.e. ib_s->status is non-zero, while ret is zero.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (wqnp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock kmem_free(wqnp, sizeof (ibcm_arp_prwqn_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockarp_ibaddr_done:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ret = ib_s->status;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_exit(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockarp_ibaddr_error:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mutex_destroy(&ib_s->lock);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cv_destroy(&ib_s->cv);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock kmem_free(ib_s, sizeof (ibcm_arp_streams_t));
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock if (ret)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return (IBT_FAILURE);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock else
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (IBT_SUCCESS);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock}
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrockvoid
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_free_ibds(ibcm_arp_ibd_insts_t *ibds)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ibds->ibcm_arp_ip) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock kmem_free(ibds->ibcm_arp_ip, ibds->ibcm_arp_ibd_alloc *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (ibcm_arp_ip_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_alloc = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_cnt = 0;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock ibds->ibcm_arp_ip = NULL;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock }
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrockstatic void
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibd_insts(ibcm_arp_ibd_insts_t *ibds)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_ip_t *ipp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ib_gid_t port_gid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibt_part_attr_t *attr_list, *attr;
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock int nparts;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((ibt_get_all_part_attr(&attr_list, &nparts) != IBT_SUCCESS) ||
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (nparts == 0)) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_alloc = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_cnt = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ip = NULL;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_alloc = nparts;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_cnt = 0;
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock ibds->ibcm_arp_ip = (ibcm_arp_ip_t *)kmem_zalloc(
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock nparts * sizeof (ibcm_arp_ip_t), KM_SLEEP);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock attr = attr_list;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock while (nparts--) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ibt_get_port_state_byguid(attr->pa_hca_guid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock attr->pa_port, &port_gid, NULL) == IBT_SUCCESS) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp = &ibds->ibcm_arp_ip[ibds->ibcm_arp_ibd_cnt];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_linkid = attr->pa_plinkid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_pkey = attr->pa_pkey;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_hca_guid = attr->pa_hca_guid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_port_gid = port_gid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibds->ibcm_arp_ibd_cnt++;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock attr++;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) ibt_free_part_attr(attr_list, ibds->ibcm_arp_ibd_alloc);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Issue an ioctl down to IP. There are several similar versions of this
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * function (e.g., rpcib_do_ip_ioctl()); clearly a utility routine is needed.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_do_ip_ioctl(int cmd, int len, void *arg)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock vnode_t *kkvp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock TIUSER *tiptr;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct strioctl iocb;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int err = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP, &kkvp) != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (EPROTO);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (t_kopen(NULL, kkvp->v_rdev, FREAD|FWRITE, &tiptr, CRED()) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock VN_RELE(kkvp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (EPROTO);
b01c3b58f7eb7fb570f606f96f130fb9b2018b49eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock iocb.ic_cmd = cmd;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock iocb.ic_timout = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock iocb.ic_len = len;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock iocb.ic_dp = (caddr_t)arg;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock err = kstr_ioctl(tiptr->fp->f_vnode, I_STR, (intptr_t)&iocb);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) t_kclose(tiptr, 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock VN_RELE(kkvp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (err);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Issue an SIOCGLIFCONF down to IP and return the result in `lifcp'.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * lifcp->lifc_buf is dynamically allocated to be *bufsizep bytes.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_do_lifconf(struct lifconf *lifcp, uint_t *bufsizep, sa_family_t family_loc)
b01c3b58f7eb7fb570f606f96f130fb9b2018b49eschrock{
b01c3b58f7eb7fb570f606f96f130fb9b2018b49eschrock int err;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct lifnum lifn;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bzero(&lifn, sizeof (struct lifnum));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifn.lifn_family = family_loc;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock err = ibcm_do_ip_ioctl(SIOCGLIFNUM, sizeof (struct lifnum), &lifn);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (err != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (err);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_do_lifconf: Family %d, lifn_count %d",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock family_loc, lifn.lifn_count);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Pad the interface count to account for additional interfaces that
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * may have been configured between the SIOCGLIFNUM and SIOCGLIFCONF.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifn.lifn_count += 4;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bzero(lifcp, sizeof (struct lifconf));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*lifcp))
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifcp->lifc_family = family_loc;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifcp->lifc_len = *bufsizep = lifn.lifn_count * sizeof (struct lifreq);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifcp->lifc_buf = kmem_zalloc(*bufsizep, KM_SLEEP);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor err = ibcm_do_ip_ioctl(SIOCGLIFCONF, sizeof (struct lifconf), lifcp);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (err != 0) {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor kmem_free(lifcp->lifc_buf, *bufsizep);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor return (err);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor }
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor return (0);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor}
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylorstatic ibcm_arp_ip_t *
3c112a2b34403220c06c3e2fcac403358cfba168Eric Tayloribcm_arp_lookup(ibcm_arp_ibd_insts_t *ibds, char *linkname)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock datalink_id_t linkid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int i;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: linkname = %s\n", linkname);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor /*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * If at first we don't succeed, try again, just in case it is in
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * hiding. The first call requires the datalink management daemon
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * (the authorative source of information about name to id mapping)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * to be present and answering upcalls, the second does not.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (dls_mgmt_get_linkid(linkname, &linkid) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (dls_devnet_macname2linkid(linkname, &linkid) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: could not "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "get linkid from linkname\n");
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (NULL);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor }
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor }
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor for (i = 0; i < ibds->ibcm_arp_ibd_cnt; i++) {
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor if (ibds->ibcm_arp_ip[i].ip_linkid == linkid)
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor return (&ibds->ibcm_arp_ip[i]);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor }
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: returning NULL\n");
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor return (NULL);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor}
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Fill in `ibds' with IP addresses tied to IFT_IB IP interfaces. Returns
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * B_TRUE if at least one address was filled in.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic boolean_t
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibd_ipaddr(ibcm_arp_ibd_insts_t *ibds, sa_family_t family_loc)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int i, nifs, naddr = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock uint_t bufsize;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct lifconf lifc;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct lifreq *lifrp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_ip_t *ipp;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ibcm_do_lifconf(&lifc, &bufsize, family_loc) != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (B_FALSE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock nifs = lifc.lifc_len / sizeof (struct lifreq);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibd_ipaddr: Family %d, nifs %d",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock family_loc, nifs);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (lifrp = lifc.lifc_req, i = 0; i < nifs; i++, lifrp++) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (lifrp->lifr_type != IFT_IB)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock continue;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((ipp = ibcm_arp_lookup(ibds, lifrp->lifr_name)) == NULL)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock continue;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock switch (lifrp->lifr_addr.ss_family) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case AF_INET:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_inet_family = AF_INET;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bcopy(&lifrp->lifr_addr, &ipp->ip_cm_sin,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (struct sockaddr_in));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock naddr++;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case AF_INET6:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ipp->ip_inet_family = AF_INET6;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bcopy(&lifrp->lifr_addr, &ipp->ip_cm_sin6,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (struct sockaddr_in6));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock naddr++;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock kmem_free(lifc.lifc_buf, bufsize);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (naddr > 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibt_status_t
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibds(ibcm_arp_ibd_insts_t *ibdp, sa_family_t family_loc)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef DEBUG
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int i;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds(%p)", ibdp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_get_ibd_insts(ibdp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibds: Found %d ibd instances",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibdp->ibcm_arp_ibd_cnt);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ibdp->ibcm_arp_ibd_cnt == 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (IBT_SRC_IP_NOT_FOUND);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* Get the IP addresses of active ports. */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (!ibcm_arp_get_ibd_ipaddr(ibdp, family_loc)) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: failed to get "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "ibd instance: IBT_SRC_IP_NOT_FOUND");
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_free_ibds(ibdp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (IBT_SRC_IP_NOT_FOUND);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#ifdef DEBUG
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (i = 0; i < ibdp->ibcm_arp_ibd_cnt; i++) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char my_buf[INET6_ADDRSTRLEN];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ibcm_arp_ip_t *aip = &ibdp->ibcm_arp_ip[i];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: Linkid %d Family %d "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "PKey 0x%lX \n HCAGUID 0x%llX SGID %llX:%llX",
25085d90140a7be7bb8524085d401fac7ca23cfbEric Taylor aip->ip_linkid, aip->ip_inet_family, aip->ip_pkey,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock aip->ip_hca_guid, aip->ip_port_gid.gid_prefix,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock aip->ip_port_gid.gid_guid);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (aip->ip_inet_family == AF_INET) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV4: %s",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock inet_ntop(AF_INET, &aip->ip_cm_sin.sin_addr, my_buf,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (my_buf)));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else if (aip->ip_inet_family == AF_INET6) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV6: %s",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock inet_ntop(AF_INET6, &aip->ip_cm_sin6.sin6_addr,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock my_buf, sizeof (my_buf)));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: Unknown "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "Family %d", aip->ip_inet_family);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#endif
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (IBT_SUCCESS);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock