Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Feb 2004 13:03:54 +0300
From:      Gleb Smirnoff <glebius@cell.sick.ru>
To:        fingers <fingers@fingers.co.za>
Cc:        freebsd-isp@freebsd.org
Subject:   Re: ng_netflow: testers are welcome
Message-ID:  <20040227100354.GA98027@cell.sick.ru>
In-Reply-To: <20040227083539.GA97550@cell.sick.ru>
References:  <20040121114502.GC17802@cell.sick.ru> <20040227102010.O41530@snow.fingers.co.za> <20040227083539.GA97550@cell.sick.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Feb 27, 2004 at 11:35:39AM +0300, Gleb Smirnoff wrote:
T>   Dear fingers,
T> 
T> the routing API has changed since 5.1 and release 0.2.1 crashes
T> on CURRENT. To fix this you should get netflow.c rev 1.7 from
T> anonymous CVS (or WebCVS) on http://SourceForge.net/projects/ng-netflow.

SF.net hasn't yet synchronized its anonCVS with development CVS.
I've already received two complaints about crashing, so I'll post
patch here.

--
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE

Index: netflow.c
===================================================================
RCS file: /cvsroot/ng-netflow/ng_netflow/ng_netflow/netflow.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- netflow.c	14 Feb 2004 22:26:31 -0000	1.6
+++ netflow.c	24 Feb 2004 19:10:24 -0000	1.7
@@ -31,11 +31,11 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	 $Id: netflow.c,v 1.6 2004/02/14 22:26:31 glebius Exp $
+ *	 $Id: netflow.c,v 1.7 2004/02/24 19:10:24 glebius Exp $
  */
 
 static const char rcs_id[] = 
-    "@(#) $Id: netflow.c,v 1.6 2004/02/14 22:26:31 glebius Exp $";
+    "@(#) $Id: netflow.c,v 1.7 2004/02/24 19:10:24 glebius Exp $";
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -204,15 +204,6 @@
 
 	fle->i_ifx = iface->info.if_index;
 
-	/* The problem is that rtalloc() family returns cloned host
-	 * route, which does not have mask at all. We will try to look
-	 * for mask in the rt_parent route, from which this host route
-	 * was cloned. Sometime this fails, particularly when destination
-	 * is local.
-	 * XXX: we must look for better way to implement route lookups.
-	 * May be try to dig into radix ourselves?
-	 */
-
 	/* First we do route table lookup on destination address. So we can
 	 * fill in out_ifx, dst_mask, nexthop, and dst_as in future releases.
 	 */
@@ -221,15 +212,14 @@
 	sin->sin_len = sizeof(*sin);
 	sin->sin_family = AF_INET;
 	sin->sin_addr = fle->r.r_dst;
-	rtalloc(&ro);
+#ifdef	RTF_PRCLONING	/* disappeared in CURRENT */
+	rtalloc_ign(&ro, RTF_CLONING|RTF_PRCLONING);
+#else
+	rtalloc_ign(&ro, RTF_CLONING);
+#endif
 	if (ro.ro_rt != NULL) {
 		struct rtentry *rt = ro.ro_rt;
 
-		/* This is cloned route, use its parent */
-		if (ro.ro_rt->rt_flags & RTF_WASCLONED &&
-		    ro.ro_rt->rt_parent)
-			rt = ro.ro_rt->rt_parent;
-
 		fle->o_ifx = rt->rt_ifp->if_index;
 
 		if (rt->rt_flags & RTF_GATEWAY &&
@@ -244,7 +234,7 @@
 			/* Give up. We can't determine mask :( */
 			fle->dst_mask = 32;
 
-		rtfree(ro.ro_rt);
+		RTFREE(ro.ro_rt);
 	}
 
 	/* Do route lookup on source address, to fill
@@ -256,14 +246,14 @@
 	sin->sin_len = sizeof(*sin);
 	sin->sin_family = AF_INET;
 	sin->sin_addr = fle->r.r_src;
-	rtalloc(&ro);
+#ifdef	RTF_PRCLONING	/* disappeared in CURRENT */
+	rtalloc_ign(&ro, RTF_CLONING|RTF_PRCLONING);
+#else
+	rtalloc_ign(&ro, RTF_CLONING);
+#endif
 	if (ro.ro_rt != NULL) {
 		struct rtentry *rt = ro.ro_rt;
 
-		if (ro.ro_rt->rt_flags & RTF_WASCLONED &&
-		    ro.ro_rt->rt_parent)
-			rt = ro.ro_rt->rt_parent;
-
 		if (rt_mask(rt))
 			fle->src_mask =
 			    bit_count(((struct sockaddr_in *)rt_mask(rt))->sin_addr.s_addr);
@@ -271,7 +261,7 @@
 			/* Give up. We can't determine mask :( */
 			fle->src_mask = 32;
 
-		rtfree(ro.ro_rt);
+		RTFREE(ro.ro_rt);
 	}
 
 	return (0);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040227100354.GA98027>