015f8fff605f2fbd5fd0072e555576297804d57bhiremath/*
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * CDDL HEADER START
015f8fff605f2fbd5fd0072e555576297804d57bhiremath *
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * The contents of this file are subject to the terms of the
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * Common Development and Distribution License (the "License").
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * You may not use this file except in compliance with the License.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath *
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * or http://www.opensolaris.org/os/licensing.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * See the License for the specific language governing permissions
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * and limitations under the License.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath *
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * When distributing Covered Code, include this CDDL HEADER in each
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * If applicable, add the following below this CDDL HEADER, with the
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * fields enclosed by brackets "[]" replaced with your own identifying
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * information: Portions Copyright [yyyy] [name of copyright owner]
015f8fff605f2fbd5fd0072e555576297804d57bhiremath *
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * CDDL HEADER END
015f8fff605f2fbd5fd0072e555576297804d57bhiremath */
015f8fff605f2fbd5fd0072e555576297804d57bhiremath/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath */
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/types.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/ddi.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/sunddi.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/strsubr.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/socket.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <net/if_arp.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <net/if_types.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/sockio.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/pathname.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/ib/mgt/ibcm/ibcm_arp.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/kstr.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath#include <sys/t_kuser.h>
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/dls.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
015f8fff605f2fbd5fd0072e555576297804d57bhiremathextern char cmlog[];
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmarkextern int ibcm_resolver_pr_lookup(ibcm_arp_streams_t *ib_s,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ibt_ip_addr_t *dst_addr, ibt_ip_addr_t *src_addr, zoneid_t myzoneid);
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmarkextern void ibcm_arp_delete_prwqn(ibcm_arp_prwqn_t *wqnp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibt_ip_addr_s))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_ip_t))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_ibd_insts_t))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", ibcm_arp_prwqn_t))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", sockaddr_in))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath_NOTE(SCHEME_PROTECTS_DATA("Unshared data", sockaddr_in6))
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathint ibcm_printip = 0;
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath/*
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * Function:
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * ibcm_ip_print
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * Input:
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * label Arbitrary qualifying string
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * ipa Pointer to IP Address to print
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath */
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathvoid
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_ip_print(char *label, ibt_ip_addr_t *ipaddr)
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath{
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath char buf[INET6_ADDRSTRLEN];
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath if (ipaddr->family == AF_INET) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L2(cmlog, "%s: %s", label,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath inet_ntop(AF_INET, &ipaddr->un.ip4addr, buf, sizeof (buf)));
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath } else if (ipaddr->family == AF_INET6) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L2(cmlog, "%s: %s", label, inet_ntop(AF_INET6,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath &ipaddr->un.ip6addr, buf, sizeof (buf)));
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath } else {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L2(cmlog, "%s: IP ADDR NOT SPECIFIED ", label);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath }
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath}
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremathibt_status_t
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremathibcm_arp_get_ibaddr(zoneid_t myzoneid, ibt_ip_addr_t srcaddr,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ibt_ip_addr_t destaddr, ib_gid_t *sgid, ib_gid_t *dgid,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ibt_ip_addr_t *saddrp)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath{
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibcm_arp_streams_t *ib_s;
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath ibcm_arp_prwqn_t *wqnp;
bbd6719318c24a8a2364080d8a139444e9944311hiremath int ret = 0;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath int len;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr(%d, %p, %p, %p, %p, %p)",
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath myzoneid, srcaddr, destaddr, sgid, dgid, saddrp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ib_s = (ibcm_arp_streams_t *)kmem_zalloc(sizeof (ibcm_arp_streams_t),
015f8fff605f2fbd5fd0072e555576297804d57bhiremath KM_SLEEP);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath mutex_init(&ib_s->lock, NULL, MUTEX_DEFAULT, NULL);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath cv_init(&ib_s->cv, NULL, CV_DRIVER, NULL);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
bbd6719318c24a8a2364080d8a139444e9944311hiremath mutex_enter(&ib_s->lock);
bbd6719318c24a8a2364080d8a139444e9944311hiremath ib_s->done = B_FALSE;
bbd6719318c24a8a2364080d8a139444e9944311hiremath mutex_exit(&ib_s->lock);
bbd6719318c24a8a2364080d8a139444e9944311hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ret = ibcm_resolver_pr_lookup(ib_s, &destaddr, &srcaddr, myzoneid);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: ibcm_resolver_pr_lookup "
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "returned: %d", ret);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ret == 0) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath mutex_enter(&ib_s->lock);
bbd6719318c24a8a2364080d8a139444e9944311hiremath while (ib_s->done != B_TRUE)
bbd6719318c24a8a2364080d8a139444e9944311hiremath cv_wait(&ib_s->cv, &ib_s->lock);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath mutex_exit(&ib_s->lock);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
bbd6719318c24a8a2364080d8a139444e9944311hiremath mutex_enter(&ib_s->lock);
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath wqnp = ib_s->wqnp;
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath if (ib_s->status == 0) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (sgid)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath *sgid = wqnp->sgid;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (dgid)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath *dgid = wqnp->dgid;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath /*
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath * If the user supplied a address, then verify we got
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath * for the same address.
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath */
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (wqnp->usrc_addr.family && sgid) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath len = (wqnp->usrc_addr.family == AF_INET) ?
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath IP_ADDR_LEN : sizeof (in6_addr_t);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (bcmp(&wqnp->usrc_addr.un,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath &wqnp->src_addr.un, len)) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: "
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "srcaddr mismatch");
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath /* Clean-up old data, and reset the done flag */
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ibcm_arp_delete_prwqn(wqnp);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ib_s->done = B_FALSE;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath mutex_exit(&ib_s->lock);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ret = ibcm_resolver_pr_lookup(ib_s, &srcaddr,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath &srcaddr, myzoneid);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (ret == 0) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath mutex_enter(&ib_s->lock);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath while (ib_s->done != B_TRUE)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath cv_wait(&ib_s->cv, &ib_s->lock);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath mutex_exit(&ib_s->lock);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath }
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath mutex_enter(&ib_s->lock);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath wqnp = ib_s->wqnp;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (ib_s->status == 0) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (sgid)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath *sgid = wqnp->dgid;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (saddrp)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath bcopy(&wqnp->src_addr, saddrp,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath sizeof (ibt_ip_addr_t));
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath IBTF_DPRINTF_L4(cmlog,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "ibcm_arp_get_ibaddr: "
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "SGID: %llX:%llX DGID: %llX:%llX",
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath sgid->gid_prefix, sgid->gid_guid,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath dgid->gid_prefix, dgid->gid_guid);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ibcm_arp_delete_prwqn(wqnp);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath } else if (ret == 0) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (wqnp)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath kmem_free(wqnp,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath sizeof (ibcm_arp_prwqn_t));
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath }
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath goto arp_ibaddr_done;
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath }
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath }
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath if (saddrp)
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath bcopy(&wqnp->src_addr, saddrp, sizeof (ibt_ip_addr_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr: SGID: %llX:%llX"
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath " DGID: %llX:%llX", sgid->gid_prefix, sgid->gid_guid,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath dgid->gid_prefix, dgid->gid_guid);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark ibcm_arp_delete_prwqn(wqnp);
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath } else if (ret == 0) {
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath /*
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath * We come here only when lookup has returned empty (failed)
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark * via callback routine.
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath * i.e. ib_s->status is non-zero, while ret is zero.
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath */
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath if (wqnp)
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath kmem_free(wqnp, sizeof (ibcm_arp_prwqn_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hirematharp_ibaddr_done:
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath ret = ib_s->status;
bbd6719318c24a8a2364080d8a139444e9944311hiremath mutex_exit(&ib_s->lock);
bbd6719318c24a8a2364080d8a139444e9944311hiremath
bbd6719318c24a8a2364080d8a139444e9944311hirematharp_ibaddr_error:
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath mutex_destroy(&ib_s->lock);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath cv_destroy(&ib_s->cv);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath kmem_free(ib_s, sizeof (ibcm_arp_streams_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ret)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (IBT_FAILURE);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath else
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (IBT_SUCCESS);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalavoid
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibcm_arp_free_ibds(ibcm_arp_ibd_insts_t *ibds)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibds->ibcm_arp_ip) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala kmem_free(ibds->ibcm_arp_ip, ibds->ibcm_arp_ibd_alloc *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (ibcm_arp_ip_t));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_alloc = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_cnt = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ip = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibcm_arp_get_ibd_insts(ibcm_arp_ibd_insts_t *ibds)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath{
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibcm_arp_ip_t *ipp;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ib_gid_t port_gid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibt_part_attr_t *attr_list, *attr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int nparts;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((ibt_get_all_part_attr(&attr_list, &nparts) != IBT_SUCCESS) ||
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (nparts == 0)) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibd_insts: Failed to "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "IB Part List - %d", nparts);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_alloc = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_cnt = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ip = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibd_insts: Found %d IB Part List",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor nparts);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_alloc = nparts;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_cnt = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ip = (ibcm_arp_ip_t *)kmem_zalloc(
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nparts * sizeof (ibcm_arp_ip_t), KM_SLEEP);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attr = attr_list;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala while (nparts--) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibt_get_port_state_byguid(attr->pa_hca_guid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attr->pa_port, &port_gid, NULL) == IBT_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ipp = &ibds->ibcm_arp_ip[ibds->ibcm_arp_ibd_cnt];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ipp->ip_linkid = attr->pa_plinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ipp->ip_pkey = attr->pa_pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ipp->ip_hca_guid = attr->pa_hca_guid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ipp->ip_port_gid = port_gid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibds->ibcm_arp_ibd_cnt++;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "PartAttr: p-linkid %lX, "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "d-linkid %lX, pkey 0x%lX", ipp->ip_linkid,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor attr->pa_dlinkid, ipp->ip_pkey);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "hca_guid 0x%llX, "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "port_gid %llX \n attr-port_guid %llX",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ipp->ip_hca_guid, ipp->ip_port_gid.gid_guid,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor attr->pa_port_guid);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attr++;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) ibt_free_part_attr(attr_list, ibds->ibcm_arp_ibd_alloc);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath/*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Issue an ioctl down to IP. There are several similar versions of this
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * function (e.g., rpcib_do_ip_ioctl()); clearly a utility routine is needed.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath */
015f8fff605f2fbd5fd0072e555576297804d57bhiremathstatic int
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemibcm_do_ip_ioctl(int cmd, int len, void *arg)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath{
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe vnode_t *kkvp;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem TIUSER *tiptr;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem struct strioctl iocb;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem int err = 0;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP, &kkvp) != 0)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (EPROTO);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe if (t_kopen(NULL, kkvp->v_rdev, FREAD|FWRITE, &tiptr, CRED()) != 0) {
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe VN_RELE(kkvp);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (EPROTO);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem iocb.ic_cmd = cmd;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem iocb.ic_timout = 0;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem iocb.ic_len = len;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem iocb.ic_dp = (caddr_t)arg;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = kstr_ioctl(tiptr->fp->f_vnode, I_STR, (intptr_t)&iocb);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem (void) t_kclose(tiptr, 0);
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe VN_RELE(kkvp);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (err);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem/*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Issue an SIOCGLIFCONF down to IP and return the result in `lifcp'.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * lifcp->lifc_buf is dynamically allocated to be *bufsizep bytes.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemstatic int
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_do_lifconf(struct lifconf *lifcp, uint_t *bufsizep, sa_family_t family_loc)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem int err;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem struct lifnum lifn;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem bzero(&lifn, sizeof (struct lifnum));
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath lifn.lifn_family = family_loc;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifn.lifn_flags = LIFC_NOXMIT | LIFC_TEMPORARY | LIFC_ALLZONES;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = ibcm_do_ip_ioctl(SIOCGLIFNUM, sizeof (struct lifnum), &lifn);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (err != 0)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (err);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L3(cmlog, "ibcm_do_lifconf: Family %d, lifn_count %d",
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath family_loc, lifn.lifn_count);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem /*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Pad the interface count to account for additional interfaces that
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * may have been configured between the SIOCGLIFNUM and SIOCGLIFCONF.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem lifn.lifn_count += 4;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem bzero(lifcp, sizeof (struct lifconf));
03494a9880d80f834bec10a1e8f0a2f8f7c97bf4Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*lifcp))
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath lifcp->lifc_family = family_loc;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem lifcp->lifc_len = *bufsizep = lifn.lifn_count * sizeof (struct lifreq);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem lifcp->lifc_buf = kmem_zalloc(*bufsizep, KM_SLEEP);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifcp->lifc_flags = LIFC_NOXMIT | LIFC_TEMPORARY | LIFC_ALLZONES;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = ibcm_do_ip_ioctl(SIOCGLIFCONF, sizeof (struct lifconf), lifcp);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (err != 0) {
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem kmem_free(lifcp->lifc_buf, *bufsizep);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (err);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem }
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (0);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic ibcm_arp_ip_t *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibcm_arp_lookup(ibcm_arp_ibd_insts_t *ibds, char *linkname)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int i;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: linkname = %s", linkname);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If at first we don't succeed, try again, just in case it is in
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * hiding. The first call requires the datalink management daemon
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * (the authorative source of information about name to id mapping)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * to be present and answering upcalls, the second does not.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dls_mgmt_get_linkid(linkname, &linkid) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dls_devnet_macname2linkid(linkname, &linkid) != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "ibcm_arp_lookup: could not "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "get linkid from linkname (%s)", linkname);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (i = 0; i < ibds->ibcm_arp_ibd_cnt; i++) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibds->ibcm_arp_ip[i].ip_linkid == linkid)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (&ibds->ibcm_arp_ip[i]);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "ibcm_arp_lookup: returning NULL for "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "linkname (%s)", linkname);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem/*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Fill in `ibds' with IP addresses tied to IFT_IB IP interfaces. Returns
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * B_TRUE if at least one address was filled in.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemstatic boolean_t
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_arp_get_ibd_ipaddr(ibcm_arp_ibd_insts_t *ibds, sa_family_t family_loc)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem int i, nifs, naddr = 0;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem uint_t bufsize;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem struct lifconf lifc;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor struct lifreq *lifrp, lifr_copy;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem ibcm_arp_ip_t *ipp;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgroupinfo_t lifgr;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int err;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor char ifname[LIFNAMSIZ + 1];
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor uint64_t ifflags = 0;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor zoneid_t ifzoneid;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath if (ibcm_do_lifconf(&lifc, &bufsize, family_loc) != 0)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (B_FALSE);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem nifs = lifc.lifc_len / sizeof (struct lifreq);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibd_ipaddr: Family %d, nifs %d",
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath family_loc, nifs);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (lifrp = lifc.lifc_req, i = 0; i < nifs; i++, lifrp++) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (lifrp->lifr_type != IFT_IB)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem continue;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "\nInterface# : %d", i);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifr_name : %s, lifr_family :%X, "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "lifr_type : 0x%lX", lifrp->lifr_name,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifrp->lifr_addr.ss_family, lifrp->lifr_type);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (void) strlcpy(ifname, lifrp->lifr_name, LIFNAMSIZ);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Get ZoneId. */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy = *lifrp;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ifzoneid = 0;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err = ibcm_do_ip_ioctl(SIOCGLIFZONE, sizeof (struct lifreq),
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor &lifr_copy);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (err != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "IFZONE ioctl Failed: err = %d",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor } else {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifr_zoneid : 0x%X",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy.lifr_zoneid);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ifzoneid = lifr_copy.lifr_zoneid;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Get IfIndex. */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy = *lifrp;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err = ibcm_do_ip_ioctl(SIOCGLIFINDEX, sizeof (struct lifreq),
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor &lifr_copy);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (err != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "IFINDEX ioctl Failed: err = %d",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor } else
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifr_index : 0x%X",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy.lifr_index);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Get Interface flags. */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy = *lifrp;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err = ibcm_do_ip_ioctl(SIOCGLIFFLAGS, sizeof (struct lifreq),
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor &lifr_copy);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (err != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "IFFLAGS ioctl Failed: err = %d",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor } else {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ifflags = lifr_copy.lifr_flags;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifr_flags : 0x%llX",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ifflags);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy = *lifrp;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err = ibcm_do_ip_ioctl(SIOCGLIFGROUPNAME,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sizeof (struct lifreq), &lifr_copy);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (err != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L3(cmlog, "IFGroupName ioctl Failed: "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "err = %d", err);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (lifr_copy.lifr_groupname[0] != '\0') {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifr_groupname : %s",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy.lifr_groupname);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (void) strlcpy(lifgr.gi_grname,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifr_copy.lifr_groupname, LIFGRNAMSIZ);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor err = ibcm_do_ip_ioctl(SIOCGLIFGROUPINFO,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sizeof (struct lifgroupinfo), &lifgr);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (err != 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L2(cmlog, "IFGroupINFO ioctl "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "Failed: err = %d", err);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor } else {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "lifgroupinfo details");
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "grname : %s, grifname :"
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor " %s, m4ifname : %s, m6ifname : %s",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgr.gi_grname, lifgr.gi_grifname,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgr.gi_m4ifname, lifgr.gi_m6ifname);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "gi_bcifname : %s",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgr.gi_bcifname);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor IBTF_DPRINTF_L4(cmlog, "gi_v4 %d, gi_v6 %d, "
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor "gi_nv4 %d, gi_nv6 %d, gi_mactype %d",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgr.gi_v4, lifgr.gi_v6, lifgr.gi_nv4,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor lifgr.gi_nv6, lifgr.gi_mactype);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (void) strlcpy(ifname, lifgr.gi_bcifname,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor LIFNAMSIZ);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if ((ipp = ibcm_arp_lookup(ibds, ifname)) == NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ipp->ip_zoneid = ifzoneid; /* Copy back the zoneid info */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem switch (lifrp->lifr_addr.ss_family) {
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem case AF_INET:
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ipp->ip_inet_family = AF_INET;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem bcopy(&lifrp->lifr_addr, &ipp->ip_cm_sin,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath sizeof (struct sockaddr_in));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem naddr++;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem break;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem case AF_INET6:
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem ipp->ip_inet_family = AF_INET6;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem bcopy(&lifrp->lifr_addr, &ipp->ip_cm_sin6,
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem sizeof (struct sockaddr_in6));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem naddr++;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem break;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem kmem_free(lifc.lifc_buf, bufsize);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (naddr > 0);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath}
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremathibt_status_t
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_arp_get_ibds(ibcm_arp_ibd_insts_t *ibdp, sa_family_t family_loc)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath{
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath#ifdef DEBUG
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath int i;
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath#endif
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds(%p)", ibdp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibcm_arp_get_ibd_insts(ibdp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibds: Found %d ibd instances",
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibdp->ibcm_arp_ibd_cnt);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ibdp->ibcm_arp_ibd_cnt == 0)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (IBT_SRC_IP_NOT_FOUND);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath /* Get the IP addresses of active ports. */
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath if (!ibcm_arp_get_ibd_ipaddr(ibdp, family_loc)) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: failed to get "
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "ibd instance: IBT_SRC_IP_NOT_FOUND");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibcm_arp_free_ibds(ibdp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (IBT_SRC_IP_NOT_FOUND);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath }
015f8fff605f2fbd5fd0072e555576297804d57bhiremath
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath#ifdef DEBUG
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath for (i = 0; i < ibdp->ibcm_arp_ibd_cnt; i++) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath char my_buf[INET6_ADDRSTRLEN];
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath ibcm_arp_ip_t *aip = &ibdp->ibcm_arp_ip[i];
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: Linkid %d Family %d "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "PKey 0x%lX \n HCAGUID 0x%llX SGID %llX:%llX",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala aip->ip_linkid, aip->ip_inet_family, aip->ip_pkey,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath aip->ip_hca_guid, aip->ip_port_gid.gid_prefix,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath aip->ip_port_gid.gid_guid);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath if (aip->ip_inet_family == AF_INET) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV4: %s",
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath inet_ntop(AF_INET, &aip->ip_cm_sin.sin_addr, my_buf,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath sizeof (my_buf)));
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath } else if (aip->ip_inet_family == AF_INET6) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV6: %s",
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath inet_ntop(AF_INET6, &aip->ip_cm_sin6.sin6_addr,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath my_buf, sizeof (my_buf)));
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath } else {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: Unknown "
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath "Family %d", aip->ip_inet_family);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath }
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath }
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath#endif
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath
015f8fff605f2fbd5fd0072e555576297804d57bhiremath return (IBT_SUCCESS);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath}