From owner-svn-src-stable-11@freebsd.org Fri Dec 8 19:19:48 2017 Return-Path: Delivered-To: svn-src-stable-11@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7FB11E8BA3C; Fri, 8 Dec 2017 19:19:48 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3E4497F707; Fri, 8 Dec 2017 19:19:48 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id vB8JJlPP077389; Fri, 8 Dec 2017 19:19:47 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id vB8JJlZe077388; Fri, 8 Dec 2017 19:19:47 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <201712081919.vB8JJlZe077388@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Fri, 8 Dec 2017 19:19:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r326703 - stable/11/sys/ofed/drivers/infiniband/core X-SVN-Group: stable-11 X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: stable/11/sys/ofed/drivers/infiniband/core X-SVN-Commit-Revision: 326703 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-11@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for only the 11-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Dec 2017 19:19:48 -0000 Author: hselasky Date: Fri Dec 8 19:19:47 2017 New Revision: 326703 URL: https://svnweb.freebsd.org/changeset/base/326703 Log: Add support for IPv6 based addresses as part of the TCP unify portspace feature in ibcore. This resolves an interopability issue when using both iWarp(T6) and RDMA(CX-4 and CX-5) devices at the same time. The problem is IPv4 based sockets cannot be bound to an IPv6 based address causing sobind() to fail preventing all use of IPv6 based addresses with RDMA when an iWarp device is present. This is a direct commit. Tested by: KrishnamRaju ErapaRaju Sponsored by: Mellanox Technologies Modified: stable/11/sys/ofed/drivers/infiniband/core/cma.c Modified: stable/11/sys/ofed/drivers/infiniband/core/cma.c ============================================================================== --- stable/11/sys/ofed/drivers/infiniband/core/cma.c Fri Dec 8 18:43:31 2017 (r326702) +++ stable/11/sys/ofed/drivers/infiniband/core/cma.c Fri Dec 8 19:19:47 2017 (r326703) @@ -2569,32 +2569,37 @@ static int cma_get_tcp_port(struct rdma_id_private *id int ret; int size; struct socket *sock; + struct sockaddr *src_addr = (struct sockaddr *)&id_priv->id.route.addr.src_addr; - ret = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); + switch (src_addr->sa_family) { + case AF_INET: + case AF_INET6: + break; + default: + /* other address families are not handled by iWarp */ + id_priv->unify_ps_tcp = 0; + return (0); + } + + ret = sock_create_kern(src_addr->sa_family, SOCK_STREAM, IPPROTO_TCP, &sock); if (ret) return ret; #ifdef __linux__ - ret = sock->ops->bind(sock, - (struct sockaddr *) &id_priv->id.route.addr.src_addr, - ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr)); + ret = sock->ops->bind(sock, src_addr, ip_addr_size(src_addr)); #else SOCK_LOCK(sock); sock->so_options |= SO_REUSEADDR; SOCK_UNLOCK(sock); - ret = -sobind(sock, - (struct sockaddr *)&id_priv->id.route.addr.src_addr, - curthread); + ret = -sobind(sock, src_addr, curthread); #endif if (ret) { sock_release(sock); return ret; } - size = ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr); - ret = sock_getname(sock, - (struct sockaddr *) &id_priv->id.route.addr.src_addr, - &size, 0); + size = ip_addr_size(src_addr); + ret = sock_getname(sock, src_addr, &size, 0); if (ret) { sock_release(sock); return ret;