PERFORCE change 138489 for review
Qing Li
qingli at FreeBSD.org
Tue Mar 25 02:28:29 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=138489
Change 138489 by qingli at FreeBSD-newarp on 2008/03/25 02:28:08
Checking in the missing files from the last commit.
Fixed a locking issue, but there is one more radix
head locking issue that is causing a panic... debugging
is in progress.
Affected files ...
.. //depot/projects/qingli_mpath/src/sys/net/radix_mpath.c#2 edit
.. //depot/projects/qingli_mpath/src/sys/net/rtsock.c#4 edit
.. //depot/projects/qingli_mpath/src/sys/netinet/ip_output.c#3 edit
.. //depot/projects/qingli_mpath/src/sys/netinet6/in6_src.c#3 edit
.. //depot/projects/qingli_mpath/src/sys/netinet6/nd6_nbr.c#2 edit
Differences ...
==== //depot/projects/qingli_mpath/src/sys/net/radix_mpath.c#2 (text+ko) ====
@@ -103,12 +103,12 @@
rn = (struct radix_node *)rt;
do {
rt = (struct rtentry *)rn;
- /* Qing
- * we are removing an address alias that has
- * the same prefix as another address
- * we need to compare the interface address because
- * rt_gateway is a special sockadd_dl structure
- */
+ /*
+ * we are removing an address alias that has
+ * the same prefix as another address
+ * we need to compare the interface address because
+ * rt_gateway is a special sockadd_dl structure
+ */
if (rt->rt_gateway->sa_family == AF_LINK) {
if (!memcmp(rt->rt_ifa->ifa_addr, gate, gate->sa_len))
break;
@@ -274,8 +274,10 @@
ro->ro_rt = rtalloc1(&ro->ro_dst, 1, 0UL);
/* if the route does not exist or it is not multipath, don't care */
- if (!ro->ro_rt || !rn_mpath_next((struct radix_node *)ro->ro_rt))
+ if (!ro->ro_rt || !rn_mpath_next((struct radix_node *)ro->ro_rt)) {
+ RT_UNLOCK(ro->ro_rt);
return;
+ }
/* beyond here, we use rn as the master copy */
rn0 = rn = (struct radix_node *)ro->ro_rt;
@@ -294,12 +296,16 @@
/* XXX try filling rt_gwroute and avoid unreachable gw */
/* if gw selection fails, use the first match (default) */
- if (!rn)
+ if (!rn) {
+ RT_UNLOCK(ro->ro_rt);
return;
-
+ }
+
rtfree(ro->ro_rt);
ro->ro_rt = (struct rtentry *)rn;
+ RT_LOCK(ro->ro_rt);
ro->ro_rt->rt_refcnt++;
+ RT_UNLOCK(ro->ro_rt);
}
extern int in6_inithead __P((void **head, int off));
==== //depot/projects/qingli_mpath/src/sys/net/rtsock.c#4 (text+ko) ====
@@ -434,7 +434,6 @@
if (rn_mpath_capable(rnh) &&
(rtm->rtm_type != RTM_GET || info.rti_info[RTAX_GATEWAY])) {
rt = rt_mpath_matchgate(rt, info.rti_info[RTAX_GATEWAY]);
- rnh = (struct radix_node_head *)rt;
if (!rt) {
RADIX_NODE_HEAD_UNLOCK(rnh);
senderr(ESRCH);
==== //depot/projects/qingli_mpath/src/sys/netinet/ip_output.c#3 (text+ko) ====
@@ -36,6 +36,7 @@
#include "opt_ipsec.h"
#include "opt_mac.h"
#include "opt_mbuf_stress_test.h"
+#include "opt_mpath.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -54,6 +55,9 @@
#include <net/netisr.h>
#include <net/pfil.h>
#include <net/route.h>
+#ifdef RADIX_MPATH
+#include <net/radix_mpath.h>
+#endif
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -225,7 +229,12 @@
* operation (as it is for ARP).
*/
if (ro->ro_rt == NULL)
+#ifdef RADIX_MPATH
+ rtalloc_mpath(ro,
+ ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr));
+#else
rtalloc_ign(ro, 0);
+#endif
if (ro->ro_rt == NULL) {
ipstat.ips_noroute++;
error = EHOSTUNREACH;
==== //depot/projects/qingli_mpath/src/sys/netinet6/in6_src.c#3 (text+ko) ====
@@ -65,6 +65,7 @@
#include "opt_inet.h"
#include "opt_inet6.h"
+#include "opt_mpath.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -84,6 +85,9 @@
#include <net/if.h>
#include <net/route.h>
+#ifdef RADIX_MPATH
+#include <net/radix_mpath.h>
+#endif
#include <netinet/in.h>
#include <netinet/in_var.h>
@@ -568,7 +572,12 @@
sa6->sin6_scope_id = 0;
if (clone) {
+#ifdef RADIX_MPATH
+ rtalloc_mpath((struct route *)ro,
+ ntohl(sa6->sin6_addr.s6_addr32[3]));
+#else
rtalloc((struct route *)ro);
+#endif
} else {
ro->ro_rt = rtalloc1(&((struct route *)ro)
->ro_dst, 0, 0UL);
==== //depot/projects/qingli_mpath/src/sys/netinet6/nd6_nbr.c#2 (text+ko) ====
@@ -36,6 +36,7 @@
#include "opt_inet6.h"
#include "opt_ipsec.h"
#include "opt_carp.h"
+#include "opt_mpath.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -55,6 +56,9 @@
#include <net/if_dl.h>
#include <net/if_var.h>
#include <net/route.h>
+#ifdef RADIX_MPATH
+#include <net/radix_mpath.h>
+#endif
#include <netinet/in.h>
#include <netinet/in_var.h>
@@ -208,13 +212,23 @@
struct rtentry *rt;
struct sockaddr_in6 tsin6;
int need_proxy;
+#ifdef RADIX_MPATH
+ struct route_in6 ro;
+#endif
bzero(&tsin6, sizeof tsin6);
tsin6.sin6_len = sizeof(struct sockaddr_in6);
tsin6.sin6_family = AF_INET6;
tsin6.sin6_addr = taddr6;
+#ifdef RADIX_MPATH
+ bzero(&ro, sizeof(ro));
+ ro.ro_dst = tsin6;
+ rtalloc_mpath((struct route *)&ro, RTF_ANNOUNCE);
+ rt = ro.ro_rt;
+#else
rt = rtalloc1((struct sockaddr *)&tsin6, 0, 0);
+#endif
need_proxy = (rt && (rt->rt_flags & RTF_ANNOUNCE) != 0 &&
rt->rt_gateway->sa_family == AF_LINK);
if (rt)
More information about the p4-projects
mailing list