From owner-svn-src-projects@FreeBSD.ORG  Sat Oct 25 21:40:50 2014
Return-Path: <owner-svn-src-projects@FreeBSD.ORG>
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" <melifaro@FreeBSD.org>
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 &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=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 <netinet/if_ether.h>
+#include <net/rt_nhops.h>
 
 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)