From owner-svn-src-head@freebsd.org Tue Jul 17 08:48:31 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 38C841030ED4; Tue, 17 Jul 2018 08:48:31 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id DECDA7B3E9; Tue, 17 Jul 2018 08:48:30 +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 mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id BF86A1144; Tue, 17 Jul 2018 08:48:30 +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 w6H8mUc2096892; Tue, 17 Jul 2018 08:48:30 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w6H8mUeZ096891; Tue, 17 Jul 2018 08:48:30 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <201807170848.w6H8mUeZ096891@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Tue, 17 Jul 2018 08:48:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r336364 - head/sys/ofed/drivers/infiniband/core X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/ofed/drivers/infiniband/core X-SVN-Commit-Revision: 336364 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Jul 2018 08:48:31 -0000 Author: hselasky Date: Tue Jul 17 08:48:30 2018 New Revision: 336364 URL: https://svnweb.freebsd.org/changeset/base/336364 Log: Only update source address when resolving is successful in ibcore. When resolving an IP address in ibcore, only update the source address upon normal completion. The ibcore address resolve function does not care about the scope ID value of the IPv6 link-local addresses and expects this information has already been extracted into the bound_dev_if field. Because the same IPv6 link-local address can exist on multiple interfaces the ibcore address resolver gets confused and returns ENETUNREACH. Instead of updating both source address and bound_dev_if just keep the address set to any address until resolving completes. For the sake of code symmetry a similar change has been applied to the IPv4 address resolve path. MFC after: 1 week Sponsored by: Mellanox Technologies Modified: head/sys/ofed/drivers/infiniband/core/ib_addr.c Modified: head/sys/ofed/drivers/infiniband/core/ib_addr.c ============================================================================== --- head/sys/ofed/drivers/infiniband/core/ib_addr.c Tue Jul 17 08:34:49 2018 (r336363) +++ head/sys/ofed/drivers/infiniband/core/ib_addr.c Tue Jul 17 08:48:30 2018 (r336364) @@ -257,7 +257,7 @@ static int addr4_resolve(struct sockaddr_in *src_in, }; struct sockaddr_in dst_tmp = *dst_in; in_port_t src_port; - struct sockaddr *saddr; + struct sockaddr *saddr = NULL; struct rtentry *rte; struct ifnet *ifp; int error; @@ -333,11 +333,6 @@ static int addr4_resolve(struct sockaddr_in *src_in, /* get destination network interface from route */ ifp = rte->rt_ifp; dev_hold(ifp); - - /* update source address */ - src_port = src_in->sin_port; - memcpy(src_in, saddr, rdma_addr_size(saddr)); - src_in->sin_port = src_port; /* preserve port number */ break; default: break; @@ -369,6 +364,15 @@ static int addr4_resolve(struct sockaddr_in *src_in, addr->network = RDMA_NETWORK_IPV4; } + /* + * Step 4 - update source address, if any + */ + if (saddr != NULL) { + src_port = src_in->sin_port; + memcpy(src_in, saddr, rdma_addr_size(saddr)); + src_in->sin_port = src_port; /* preserve port number */ + } + if (rte != NULL) RTFREE(rte); @@ -412,7 +416,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, }; struct sockaddr_in6 dst_tmp = *dst_in; in_port_t src_port; - struct sockaddr *saddr; + struct sockaddr *saddr = NULL; struct rtentry *rte; struct ifnet *ifp; int error; @@ -502,10 +506,6 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, /* get destination network interface from route */ ifp = rte->rt_ifp; dev_hold(ifp); - - src_port = src_in->sin6_port; - memcpy(src_in, saddr, rdma_addr_size(saddr)); - src_in->sin6_port = src_port; /* preserve port number */ break; default: break; @@ -532,6 +532,15 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, goto error_put_ifp; else if (is_gw != 0) addr->network = RDMA_NETWORK_IPV6; + } + + /* + * Step 4 - update source address, if any + */ + if (saddr != NULL) { + src_port = src_in->sin6_port; + memcpy(src_in, saddr, rdma_addr_size(saddr)); + src_in->sin6_port = src_port; /* preserve port number */ } if (rte != NULL)