svn commit: r194510 - user/kmacy/releng_7_2_fcs/sys/net
Kip Macy
kmacy at FreeBSD.org
Fri Jun 19 20:05:10 UTC 2009
Author: kmacy
Date: Fri Jun 19 20:05:09 2009
New Revision: 194510
URL: http://svn.freebsd.org/changeset/base/194510
Log:
add per-packet support to rtalloc_mpath_fib
Modified:
user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.c
user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.h
Modified: user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.c Fri Jun 19 19:59:43 2009 (r194509)
+++ user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.c Fri Jun 19 20:05:09 2009 (r194510)
@@ -258,8 +258,11 @@ different:
return 0;
}
-void
-rtalloc_mpath_fib(struct route *ro, uint32_t hash, u_int fibnum)
+#define RT_MP_NORMAL 0
+#define RT_MP_LIST 1
+
+static void
+rtalloc_mpath_fib_(struct route *ro, uint32_t hash, u_int fibnum, int type)
{
struct radix_node *rn0, *rn;
u_int32_t n;
@@ -277,15 +280,19 @@ rtalloc_mpath_fib(struct route *ro, uint
/* if the route does not exist or it is not multipath, don't care */
if (ro->ro_rt == NULL)
return;
- if (rn_mpath_next((struct radix_node *)ro->ro_rt) == NULL) {
+ if (rn_mpath_next((struct radix_node *)ro->ro_rt) == NULL ||
+ ((type == RT_MP_LIST) && (ro->ro_rt->rt_flags & RTF_PPACKET))) {
RT_UNLOCK(ro->ro_rt);
return;
}
-
+
/* beyond here, we use rn as the master copy */
rn0 = rn = (struct radix_node *)ro->ro_rt;
n = rn_mpath_count(rn0);
+ if (ro->ro_rt->rt_flags & RTF_PPACKET)
+ hash = arc4random();
+
/* gw selection by Modulo-N Hash (RFC2991) XXX need improvement? */
hash += hashjitter;
hash %= n;
@@ -317,6 +324,21 @@ rtalloc_mpath_fib(struct route *ro, uint
RT_UNLOCK(ro->ro_rt);
}
+void
+rtalloc_mpath_fib_list(struct route *ro, uint32_t hash, u_int fibnum)
+{
+
+ rtalloc_mpath_fib_(ro, hash, fibnum, RT_MP_LIST);
+}
+
+
+void
+rtalloc_mpath_fib(struct route *ro, uint32_t hash, u_int fibnum)
+{
+
+ rtalloc_mpath_fib_(ro, hash, fibnum, RT_MP_NORMAL);
+}
+
extern int in6_inithead(void **head, int off);
extern int in_inithead(void **head, int off);
Modified: user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.h
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.h Fri Jun 19 19:59:43 2009 (r194509)
+++ user/kmacy/releng_7_2_fcs/sys/net/radix_mpath.h Fri Jun 19 20:05:09 2009 (r194510)
@@ -51,6 +51,7 @@ struct rtentry *rt_mpath_matchgate(struc
int rt_mpath_conflict(struct radix_node_head *, struct rtentry *,
struct sockaddr *);
void rtalloc_mpath_fib(struct route *, u_int32_t, u_int);
+void rtalloc_mpath_fib_list(struct route *ro, uint32_t hash, u_int fibnum);
#define rtalloc_mpath(_route, _hash) rtalloc_mpath_fib((_route), (_hash), 0)
struct radix_node *rn_mpath_lookup(void *, void *,
struct radix_node_head *);
More information about the svn-src-user
mailing list