From owner-svn-src-projects@FreeBSD.ORG Wed Oct 27 23:23:17 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8FAD11065670; Wed, 27 Oct 2010 23:23:17 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 63C5C8FC17; Wed, 27 Oct 2010 23:23:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o9RNNHf4044010; Wed, 27 Oct 2010 23:23:17 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o9RNNHOR044008; Wed, 27 Oct 2010 23:23:17 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201010272323.o9RNNHOR044008@svn.freebsd.org> From: Jeff Roberson Date: Wed, 27 Oct 2010 23:23:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r214438 - projects/ofed/head/sys/ofed/drivers/infiniband/core X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Oct 2010 23:23:17 -0000 Author: jeff Date: Wed Oct 27 23:23:17 2010 New Revision: 214438 URL: http://svn.freebsd.org/changeset/base/214438 Log: - Refine ipv6 address handling. Sponsored by: Isilon Systems, iX Systems, and Panasas. Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/addr.c Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/addr.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/core/addr.c Wed Oct 27 23:22:43 2010 (r214437) +++ projects/ofed/head/sys/ofed/drivers/infiniband/core/addr.c Wed Oct 27 23:23:17 2010 (r214438) @@ -160,6 +160,25 @@ int rdma_translate_ip(struct sockaddr *a } } read_unlock(&dev_base_lock); +#else + { + struct sockaddr_in6 *sin6; + struct ifaddr *ifa; + in_port_t port; + + sin6 = (struct sockaddr_in6 *)addr; + port = sin6->sin6_port; + sin6->sin6_port = 0; + ifa = ifa_ifwithaddr(addr); + sin6->sin6_port = port; + if (ifa == NULL) { + ret = -ENODEV; + break; + } + ret = rdma_copy_addr(dev_addr, ifa->ifa_ifp, NULL); + ifa_free(ifa); + break; + } #endif break; #endif @@ -329,7 +348,7 @@ static int addr_resolve(struct sockaddr struct ifnet *ifp; struct llentry *lle; struct rtentry *rte; - short port; + in_port_t port; u_char edst[MAX_ADDR_LEN]; int multi; int bcast; @@ -344,6 +363,7 @@ static int addr_resolve(struct sockaddr sin = NULL; sin6 = NULL; ifp = NULL; + rte = NULL; switch (dst_in->sa_family) { case AF_INET: sin = (struct sockaddr_in *)dst_in; @@ -369,7 +389,10 @@ static int addr_resolve(struct sockaddr if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) multi = 1; sin6 = (struct sockaddr_in6 *)src_in; - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) + if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + port = sin6->sin6_port; + sin6->sin6_port = 0; + } else src_in = NULL; break; #endif @@ -384,6 +407,8 @@ static int addr_resolve(struct sockaddr ifa = ifa_ifwithaddr(src_in); if (sin) sin->sin_port = port; + if (sin6) + sin6->sin6_port = port; if (ifa == NULL) return -ENETUNREACH; ifp = ifa->ifa_ifp;