ibcm_arp.c revision 261906274d77b4a1c6d61c75d170ab5a8e85a6a7
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * See the License for the specific language governing permissions
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * and limitations under the License.
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 * CDDL HEADER END
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
015f8fff605f2fbd5fd0072e555576297804d57bhiremath * Use is subject to license terms.
015f8fff605f2fbd5fd0072e555576297804d57bhiremathextern char cmlog[];
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_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))
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * ibcm_ip_print
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * label Arbitrary qualifying string
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath * ipa Pointer to IP Address to print
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_ip_print(char *label, ibt_ip_addr_t *ipaddr)
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 IBTF_DPRINTF_L2(cmlog, "%s: IP ADDR NOT SPECIFIED ", label);
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 IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr(%d, %p, %p, %p, %p, %p)",
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath myzoneid, srcaddr, destaddr, sgid, dgid, saddrp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ib_s = (ibcm_arp_streams_t *)kmem_zalloc(sizeof (ibcm_arp_streams_t),
015f8fff605f2fbd5fd0072e555576297804d57bhiremath mutex_init(&ib_s->lock, NULL, MUTEX_DEFAULT, NULL);
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ret = ibcm_resolver_pr_lookup(ib_s, &destaddr, &srcaddr, myzoneid);
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: ibcm_resolver_pr_lookup "
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ret == 0) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath * If the user supplied a address, then verify we got
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath * for the same address.
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath len = (wqnp->usrc_addr.family == AF_INET) ?
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: "
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "srcaddr mismatch");
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath /* Clean-up old data, and reset the done flag */
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath ret = ibcm_resolver_pr_lookup(ib_s, &srcaddr,
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "ibcm_arp_get_ibaddr: "
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath "SGID: %llX:%llX DGID: %llX:%llX",
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath } else if (ret == 0) {
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath bcopy(&wqnp->src_addr, saddrp, sizeof (ibt_ip_addr_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr: SGID: %llX:%llX"
261906274d77b4a1c6d61c75d170ab5a8e85a6a7Shantkumar Hiremath " DGID: %llX:%llX", sgid->gid_prefix, sgid->gid_guid,
23a9f846c20554daf41a34c0f67d0184f9bb792fShantkumar Hiremath } else if (ret == 0) {
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 kmem_free(wqnp, sizeof (ibcm_arp_prwqn_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremathibcm_arp_get_ibd_insts_cb(dev_info_t *dip, void *arg)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibcm_arp_ibd_insts_t *ibds = (ibcm_arp_ibd_insts_t *)arg;
015f8fff605f2fbd5fd0072e555576297804d57bhiremath (strstr(ddi_get_name_addr(dip), "ipib") != NULL)) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (ibds->ibcm_arp_ibd_cnt >= ibds->ibcm_arp_ibd_alloc) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibds->ibcm_arp_ibd_alloc * sizeof (ibcm_arp_ip_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ibds->ibcm_arp_ibd_alloc * sizeof (ibcm_arp_ip_t));
015f8fff605f2fbd5fd0072e555576297804d57bhiremath if (((hca_guid = ddi_prop_get_int64(DDI_DEV_T_ANY, dip, 0,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "hca-guid", 0)) == 0) ||
015f8fff605f2fbd5fd0072e555576297804d57bhiremath "port-number", 0)) == 0) ||
015f8fff605f2fbd5fd0072e555576297804d57bhiremath (ibt_get_port_state_byguid(hca_guid, port, &port_gid,
015f8fff605f2fbd5fd0072e555576297804d57bhiremath ddi_walk_devs(ddi_root_node(), ibcm_arp_get_ibd_insts_cb, ibds);
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.
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP, &kkvp) != 0)
af4c679f647cf088543c762e33d41a3ac52cfa14Sean McEnroe if (t_kopen(NULL, kkvp->v_rdev, FREAD|FWRITE, &tiptr, CRED()) != 0) {
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = kstr_ioctl(tiptr->fp->f_vnode, I_STR, (intptr_t)&iocb);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Issue an SIOCGLIFCONF down to IP and return the result in `lifcp'.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * lifcp->lifc_buf is dynamically allocated to be *bufsizep bytes.
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_do_lifconf(struct lifconf *lifcp, uint_t *bufsizep, sa_family_t family_loc)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = ibcm_do_ip_ioctl(SIOCGLIFNUM, sizeof (struct lifnum), &lifn);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_do_lifconf: Family %d, lifn_count %d",
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Pad the interface count to account for additional interfaces that
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * may have been configured between the SIOCGLIFNUM and SIOCGLIFCONF.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem lifcp->lifc_len = *bufsizep = lifn.lifn_count * sizeof (struct lifreq);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem err = ibcm_do_ip_ioctl(SIOCGLIFCONF, sizeof (struct lifconf), lifcp);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (err != 0) {
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (0);
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.
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_arp_get_ibd_ipaddr(ibcm_arp_ibd_insts_t *ibds, sa_family_t family_loc)
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath if (ibcm_do_lifconf(&lifc, &bufsize, family_loc) != 0)
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibd_ipaddr: Family %d, nifs %d",
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem i < nifs && naddr < ibds->ibcm_arp_ibd_cnt; i++, lifrp++) {
015f8fff605f2fbd5fd0072e555576297804d57bhiremath sizeof (struct sockaddr_in));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem sizeof (struct sockaddr_in6));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (naddr > 0);
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremathibcm_arp_get_ibds(ibcm_arp_ibd_insts_t *ibdp, sa_family_t family_loc)
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds(%p)", ibdp);
015f8fff605f2fbd5fd0072e555576297804d57bhiremath IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibds: Found %d ibd instances",
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");
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath for (i = 0; i < ibdp->ibcm_arp_ibd_cnt; i++) {
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath ibcm_arp_ip_t *aip = &ibdp->ibcm_arp_ip[i];
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: ibd[%d]: Family %d "
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath "Instance %d PKey 0x%lX \n HCAGUID 0x%llX SGID %llX:%llX",
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath i, aip->ip_inet_family, aip->ip_inst, aip->ip_pkey,
d3a82192edbbe93c6027629b50fd93fed5d0e1abShantkumar Hiremath aip->ip_hca_guid, aip->ip_port_gid.gid_prefix,
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 } 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 IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: Unknown "