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