svn commit: r184525 - user/kmacy/HEAD_fast_xmit/sys/net

Kip Macy kmacy at FreeBSD.org
Sat Nov 1 10:55:30 PDT 2008


Author: kmacy
Date: Sat Nov  1 17:55:29 2008
New Revision: 184525
URL: http://svn.freebsd.org/changeset/base/184525

Log:
  - arpresolve gateway address for gateway routes
  - simplify gateway validation check to fix case where the fl entry lock wasn't getting droppd

Modified:
  user/kmacy/HEAD_fast_xmit/sys/net/flowtable.c

Modified: user/kmacy/HEAD_fast_xmit/sys/net/flowtable.c
==============================================================================
--- user/kmacy/HEAD_fast_xmit/sys/net/flowtable.c	Sat Nov  1 17:02:01 2008	(r184524)
+++ user/kmacy/HEAD_fast_xmit/sys/net/flowtable.c	Sat Nov  1 17:55:29 2008	(r184525)
@@ -534,9 +534,7 @@ route_to_rtentry_info(struct route *ro, 
 	if ((rt->rt_flags & RTF_GATEWAY) && !IN_MULTICAST(sin->sin_addr.s_addr))
 		memcpy(&ri->ri_dst, rt->rt_gateway, sizeof(struct sockaddr));
 	else
-		memcpy(&ri->ri_dst, sin, sizeof(struct sockaddr));
-
-	((struct sockaddr *)&ri->ri_dst)->sa_family = AF_INET;
+		memcpy(&ri->ri_dst, sin, sizeof(struct sockaddr_in));
 	
 	if (desten) {
 		memcpy(ri->ri_desten, desten, ETHER_ADDR_LEN);
@@ -565,6 +563,15 @@ flowtable_key_equal(struct flentry *fle,
 	return (1);
 }
 
+static __inline int
+gw_valid(struct flentry *fle)
+{
+	return ((fle->f_rt->rt_flags & RTF_GATEWAY) == 0 ||
+	    ((fle->f_rt->rt_flags & RTF_GATEWAY) && 
+		(fle->f_rt->rt_gwroute->rt_flags & RTF_UP)));
+}
+
+
 int
 flowtable_lookup(struct flowtable *ft, struct mbuf *m,
     struct rtentry_info *ri)
@@ -605,12 +612,8 @@ flowtable_lookup(struct flowtable *ft, s
 	    && flowtable_key_equal(fle, key, flags)
 	    && (proto == fle->f_proto)
 	    && (fle->f_rt->rt_flags & RTF_UP)
-	    && (fle->f_uptime > fle->f_rt->rt_llinfo_uptime)) {
-
-		if ((fle->f_rt->rt_flags & RTF_GATEWAY) &&
-		    ((fle->f_rt->rt_gwroute->rt_flags & RTF_UP) == 0))
-			goto uncached;
-
+	    && (fle->f_uptime > fle->f_rt->rt_llinfo_uptime)
+	    && gw_valid(fle)) {
 		fle->f_uptime = time_uptime;
 		fle->f_flags |= flags;
 		fle->f_rt->rt_rmx.rmx_pksent++;
@@ -637,8 +640,12 @@ uncached:
 	if (ro.ro_rt == NULL) 
 		error = ENETUNREACH;
 	else {
-		error = arpresolve(ro.ro_rt->rt_ifp, ro.ro_rt, NULL,
-		    &ro.ro_dst, desten);
+		if (ro.ro_rt->rt_flags & RTF_GATEWAY)
+			error = arpresolve(ro.ro_rt->rt_ifp, ro.ro_rt,
+			    NULL, ro.ro_rt->rt_gateway, desten);
+		else
+			error = arpresolve(ro.ro_rt->rt_ifp, ro.ro_rt,
+			    NULL, &ro.ro_dst, desten);
 		route_to_rtentry_info(&ro, error ? NULL : desten, ri);
 
 		if (error == 0 && cache)


More information about the svn-src-user mailing list