From owner-svn-src-projects@FreeBSD.ORG Sat Oct 25 21:40:50 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 63E3335A; Sat, 25 Oct 2014 21:40:50 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::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 45357D27; Sat, 25 Oct 2014 21:40:50 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s9PLeoFb037745; Sat, 25 Oct 2014 21:40:50 GMT (envelope-from melifaro@FreeBSD.org) Received: (from melifaro@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s9PLeoQZ037744; Sat, 25 Oct 2014 21:40:50 GMT (envelope-from melifaro@FreeBSD.org) Message-Id: <201410252140.s9PLeoQZ037744@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: melifaro set sender to melifaro@FreeBSD.org using -f From: "Alexander V. Chernikov" Date: Sat, 25 Oct 2014 21:40:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r273648 - projects/routing/sys/ofed/drivers/infiniband/core X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 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: Sat, 25 Oct 2014 21:40:50 -0000 Author: melifaro Date: Sat Oct 25 21:40:49 2014 New Revision: 273648 URL: https://svnweb.freebsd.org/changeset/base/273648 Log: Convert ofed to use new routing api. Modified: projects/routing/sys/ofed/drivers/infiniband/core/addr.c Modified: projects/routing/sys/ofed/drivers/infiniband/core/addr.c ============================================================================== --- projects/routing/sys/ofed/drivers/infiniband/core/addr.c Sat Oct 25 21:01:50 2014 (r273647) +++ projects/routing/sys/ofed/drivers/infiniband/core/addr.c Sat Oct 25 21:40:49 2014 (r273648) @@ -335,6 +335,7 @@ static int addr6_resolve(struct sockaddr #else #include +#include static int addr_resolve(struct sockaddr *src_in, struct sockaddr *dst_in, @@ -347,7 +348,8 @@ static int addr_resolve(struct sockaddr #if defined(INET) || defined(INET6) struct llentry *lle; #endif - struct rtentry *rte; + struct nhopu_extended nhu; + uint32_t fibnum; in_port_t port; u_char edst[MAX_ADDR_LEN]; int multi; @@ -363,7 +365,6 @@ static int addr_resolve(struct sockaddr sin = NULL; sin6 = NULL; ifp = NULL; - rte = NULL; switch (dst_in->sa_family) { #ifdef INET case AF_INET: @@ -421,10 +422,26 @@ static int addr_resolve(struct sockaddr /* * Make sure the route exists and has a valid link. */ - rte = rtalloc1(dst_in, 1, 0); - if (rte == NULL || rte->rt_ifp == NULL || !RT_LINK_IS_UP(rte->rt_ifp)) { - if (rte) - RTFREE_LOCKED(rte); + fibnum = RT_DEFAULT_FIB; +#ifdef INET + if (dst_in->sa_family == AF_INET) { + error = fib4_lookup_nh_ext(fibnum, + ((struct sockaddr_in *)dst_in)->sin_addr, 0, + NHOP_LOOKUP_REF, &nhu.u.nh4); + } else +#endif +#ifdef INET6 + if (dst_in->sa_family == AF_INET6) { + struct sockaddr_in6 *dst6; + dst6 = (struct sockaddr_in6 *)dst_in; + error = fib6_lookup_nh_ext(fibnum, + dst6->sin6_addr, dst6->sin6_scope_id, 0, + NHOP_LOOKUP_REF, &nhu.u.nh6); + } +#endif + if (error != 0 || !RT_LINK_IS_UP(nhu.u.nh4.nh_ifp)) { + if (error == 0) + fib_free_nh_ext(fibnum, &nhu); return -EHOSTUNREACH; } /* @@ -434,15 +451,14 @@ static int addr_resolve(struct sockaddr */ if (multi || bcast) { if (ifp == NULL) - ifp = rte->rt_ifp; - RTFREE_LOCKED(rte); - } else if (ifp && ifp != rte->rt_ifp) { - RTFREE_LOCKED(rte); + ifp = nhu.u.nh4.nh_ifp; + fib_free_nh_ext(fibnum, &nhu); + } else if (ifp && ifp != nhu.u.nh4.nh_ifp) { + fib_free_nh_ext(fibnum, &nhu); return -ENETUNREACH; } else { if (ifp == NULL) - ifp = rte->rt_ifp; - RT_UNLOCK(rte); + ifp = nhu.u.nh4.nh_ifp; } mcast: if (bcast) @@ -464,7 +480,8 @@ mcast: switch (dst_in->sa_family) { #ifdef INET case AF_INET: - error = arpresolve(ifp, rte, NULL, dst_in, edst, &lle); + /* XXX: Pass NH flags to generate proper error */ + error = arpresolve(ifp, NULL, NULL, dst_in, edst, &lle); break; #endif #ifdef INET6 @@ -476,7 +493,7 @@ mcast: /* XXX: Shouldn't happen. */ error = -EINVAL; } - RTFREE(rte); + fib_free_nh_ext(fibnum, &nhu); if (error == 0) return rdma_copy_addr(addr, ifp, edst); if (error == EWOULDBLOCK)