ibcm_arp.c revision 1cfa752f4e24c34133009b0f6c139127a5c461de
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * See the License for the specific language governing permissions
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * and limitations under the License.
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 * CDDL HEADER END
b98131cff90a91303826565dacf89c46a422e6c5Eric Taylor * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockextern char cmlog[];
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_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 * Function:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * ibcm_ip_print
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * label Arbitrary qualifying string
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * ipa Pointer to IP Address to print
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock inet_ntop(AF_INET, &ipaddr->un.ip4addr, buf, sizeof (buf)));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "%s: %s", label, inet_ntop(AF_INET6,
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L2(cmlog, "%s: IP ADDR NOT SPECIFIED ", label);
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 IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr(%d, %p, %p, %p, %p, %p)",
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor ib_s = (ibcm_arp_streams_t *)kmem_zalloc(sizeof (ibcm_arp_streams_t),
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor mutex_init(&ib_s->lock, NULL, MUTEX_DEFAULT, NULL);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor ret = ibcm_resolver_pr_lookup(ib_s, &destaddr, &srcaddr, myzoneid);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibaddr: ibcm_resolver_pr_lookup "
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor * If the user supplied a address, then verify we got
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor * for the same address.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "srcaddr mismatch");
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* Clean-up old data, and reset the done flag */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ret == 0) {
bf82a41b568b2bd31bf9814587eb25ee2e7b05ffeschrock "ibcm_arp_get_ibaddr: "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "SGID: %llX:%llX DGID: %llX:%llX",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else if (ret == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock bcopy(&wqnp->src_addr, saddrp, sizeof (ibt_ip_addr_t));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibaddr: SGID: %llX:%llX"
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock " DGID: %llX:%llX", sgid->gid_prefix, sgid->gid_guid,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else if (ret == 0) {
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 kmem_free(ibds->ibcm_arp_ip, ibds->ibcm_arp_ibd_alloc *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((ibt_get_all_part_attr(&attr_list, &nparts) != IBT_SUCCESS) ||
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) ibt_free_part_attr(attr_list, ibds->ibcm_arp_ibd_alloc);
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 if (lookupname("/dev/udp", UIO_SYSSPACE, FOLLOW, NULLVPP, &kkvp) != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (t_kopen(NULL, kkvp->v_rdev, FREAD|FWRITE, &tiptr, CRED()) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock err = kstr_ioctl(tiptr->fp->f_vnode, I_STR, (intptr_t)&iocb);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Issue an SIOCGLIFCONF down to IP and return the result in `lifcp'.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * lifcp->lifc_buf is dynamically allocated to be *bufsizep bytes.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_do_lifconf(struct lifconf *lifcp, uint_t *bufsizep, sa_family_t family_loc)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock err = ibcm_do_ip_ioctl(SIOCGLIFNUM, sizeof (struct lifnum), &lifn);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_do_lifconf: Family %d, lifn_count %d",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Pad the interface count to account for additional interfaces that
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * may have been configured between the SIOCGLIFNUM and SIOCGLIFCONF.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifcp->lifc_len = *bufsizep = lifn.lifn_count * sizeof (struct lifreq);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock lifcp->lifc_buf = kmem_zalloc(*bufsizep, KM_SLEEP);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor err = ibcm_do_ip_ioctl(SIOCGLIFCONF, sizeof (struct lifconf), lifcp);
3c112a2b34403220c06c3e2fcac403358cfba168Eric Tayloribcm_arp_lookup(ibcm_arp_ibd_insts_t *ibds, char *linkname)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: linkname = %s\n", linkname);
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 if (dls_devnet_macname2linkid(linkname, &linkid) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: could not "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "get linkid from linkname\n");
3c112a2b34403220c06c3e2fcac403358cfba168Eric Taylor IBTF_DPRINTF_L4(cmlog, "ibcm_arp_lookup: returning NULL\n");
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.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibd_ipaddr(ibcm_arp_ibd_insts_t *ibds, sa_family_t family_loc)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ibcm_do_lifconf(&lifc, &bufsize, family_loc) != 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibd_ipaddr: Family %d, nifs %d",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (lifrp = lifc.lifc_req, i = 0; i < nifs; i++, lifrp++) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((ipp = ibcm_arp_lookup(ibds, lifrp->lifr_name)) == NULL)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (struct sockaddr_in));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (struct sockaddr_in6));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (naddr > 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockibcm_arp_get_ibds(ibcm_arp_ibd_insts_t *ibdp, sa_family_t family_loc)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds(%p)", ibdp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L3(cmlog, "ibcm_arp_get_ibds: Found %d ibd instances",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* Get the IP addresses of active ports. */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: failed to get "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "ibd instance: IBT_SRC_IP_NOT_FOUND");
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 IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV4: %s",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock inet_ntop(AF_INET, &aip->ip_cm_sin.sin_addr, my_buf,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L4(cmlog, "ibcm_arp_get_ibds: IPV6: %s",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock IBTF_DPRINTF_L2(cmlog, "ibcm_arp_get_ibds: Unknown "