svn commit: r265710 - stable/9/sys/net

Alexander V. Chernikov melifaro at FreeBSD.org
Thu May 8 20:33:48 UTC 2014


Author: melifaro
Date: Thu May  8 20:33:47 2014
New Revision: 265710
URL: http://svnweb.freebsd.org/changeset/base/265710

Log:
  Merge r260379, r260460.
  
  r260379:
    Partially fix IPv4 interface routes deletion in RADIX_MPATH.
  
    Noticed by:   Nikolay Denev <ndenev at gmail.com>
  
  r260460:
    Constanly use RT_ALL_FIBS everywhere instead of -1.

Modified:
  stable/9/sys/net/radix_mpath.c
  stable/9/sys/net/route.c
  stable/9/sys/net/route.h
  stable/9/sys/net/rtsock.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/net/   (props changed)

Modified: stable/9/sys/net/radix_mpath.c
==============================================================================
--- stable/9/sys/net/radix_mpath.c	Thu May  8 20:28:22 2014	(r265709)
+++ stable/9/sys/net/radix_mpath.c	Thu May  8 20:33:47 2014	(r265710)
@@ -112,11 +112,16 @@ rt_mpath_matchgate(struct rtentry *rt, s
 		if (rt->rt_gateway->sa_family == AF_LINK) {
 			if (!memcmp(rt->rt_ifa->ifa_addr, gate, gate->sa_len))
 				break;
-		} else {
-			if (rt->rt_gateway->sa_len == gate->sa_len &&
-			    !memcmp(rt->rt_gateway, gate, gate->sa_len))
-				break;
 		}
+
+		/*
+		 * Check for other options:
+		 * 1) Routes with 'real' IPv4/IPv6 gateway
+		 * 2) Loopback host routes (another AF_LINK/sockadd_dl check)
+		 * */
+		if (rt->rt_gateway->sa_len == gate->sa_len &&
+		    !memcmp(rt->rt_gateway, gate, gate->sa_len))
+			break;
 	} while ((rn = rn_mpath_next(rn)) != NULL);
 
 	return (struct rtentry *)rn;

Modified: stable/9/sys/net/route.c
==============================================================================
--- stable/9/sys/net/route.c	Thu May  8 20:28:22 2014	(r265709)
+++ stable/9/sys/net/route.c	Thu May  8 20:33:47 2014	(r265710)
@@ -1515,7 +1515,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int
 		fibnum = RT_DEFAULT_FIB;
 		break;
 	}
-	if (fibnum == -1) {
+	if (fibnum == RT_ALL_FIBS) {
 		if (rt_add_addr_allfibs == 0 && cmd == (int)RTM_ADD) {
 			startfib = endfib = curthread->td_proc->p_fibnum;
 		} else {
@@ -1564,10 +1564,10 @@ rtinit1(struct ifaddr *ifa, int cmd, int
 				/* this table doesn't exist but others might */
 				continue;
 			RADIX_NODE_HEAD_RLOCK(rnh);
+			rn = rnh->rnh_lookup(dst, netmask, rnh);
 #ifdef RADIX_MPATH
 			if (rn_mpath_capable(rnh)) {
 
-				rn = rnh->rnh_matchaddr(dst, rnh);
 				if (rn == NULL) 
 					error = ESRCH;
 				else {
@@ -1581,13 +1581,11 @@ rtinit1(struct ifaddr *ifa, int cmd, int
 					 */
 					rt = rt_mpath_matchgate(rt,
 					    ifa->ifa_addr);
-					if (!rt) 
+					if (rt == NULL) 
 						error = ESRCH;
 				}
 			}
-			else
 #endif
-			rn = rnh->rnh_lookup(dst, netmask, rnh);
 			error = (rn == NULL ||
 			    (rn->rn_flags & RNF_ROOT) ||
 			    RNTORT(rn)->rt_ifa != ifa);
@@ -1721,7 +1719,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int
 int
 rtinit_fib(struct ifaddr *ifa, int cmd, int flags)
 {
-	return (rtinit1(ifa, cmd, flags, -1));
+	return (rtinit1(ifa, cmd, flags, RT_ALL_FIBS));
 }
 #endif
 
@@ -1745,7 +1743,7 @@ rtinit(struct ifaddr *ifa, int cmd, int 
 	case AF_INET6:
 	case AF_INET:
 		/* We do support multiple FIBs. */
-		fib = -1;
+		fib = RT_ALL_FIBS;
 		break;
 	}
 	return (rtinit1(ifa, cmd, flags, fib));

Modified: stable/9/sys/net/route.h
==============================================================================
--- stable/9/sys/net/route.h	Thu May  8 20:28:22 2014	(r265709)
+++ stable/9/sys/net/route.h	Thu May  8 20:33:47 2014	(r265710)
@@ -92,7 +92,8 @@ struct rt_metrics {
 #define	RTTTOPRHZ(r)	((r) / (RTM_RTTUNIT / PR_SLOWHZ))
 
 #define	RT_DEFAULT_FIB	0	/* Explicitly mark fib=0 restricted cases */
-extern u_int rt_numfibs;	/* number fo usable routing tables */
+#define	RT_ALL_FIBS	-1	/* Announce event for every fib */
+extern u_int rt_numfibs;	/* number of usable routing tables */
 /*
  * XXX kernel function pointer `rt_output' is visible to applications.
  */

Modified: stable/9/sys/net/rtsock.c
==============================================================================
--- stable/9/sys/net/rtsock.c	Thu May  8 20:28:22 2014	(r265709)
+++ stable/9/sys/net/rtsock.c	Thu May  8 20:33:47 2014	(r265710)
@@ -154,7 +154,6 @@ static struct	sockaddr sa_zero   = { siz
  * notification to a socket bound to a particular FIB.
  */
 #define	RTS_FILTER_FIB	M_PROTO8
-#define	RTS_ALLFIBS	-1
 
 static struct {
 	int	ip_count;	/* attached w/ AF_INET */
@@ -1218,7 +1217,7 @@ rt_missmsg_fib(int type, struct rt_addri
 	if (m == NULL)
 		return;
 
-	if (fibnum != RTS_ALLFIBS) {
+	if (fibnum != RT_ALL_FIBS) {
 		KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: fibnum out "
 		    "of range 0 <= %d < %d", __func__, fibnum, rt_numfibs));
 		M_SETFIB(m, fibnum);
@@ -1236,7 +1235,7 @@ void
 rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, int error)
 {
 
-	rt_missmsg_fib(type, rtinfo, flags, error, RTS_ALLFIBS);
+	rt_missmsg_fib(type, rtinfo, flags, error, RT_ALL_FIBS);
 }
 
 /*
@@ -1332,7 +1331,7 @@ rt_newaddrmsg_fib(int cmd, struct ifaddr
 			rtm->rtm_errno = error;
 			rtm->rtm_addrs = info.rti_addrs;
 		}
-		if (fibnum != RTS_ALLFIBS) {
+		if (fibnum != RT_ALL_FIBS) {
 			KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: "
 			    "fibnum out of range 0 <= %d < %d", __func__,
 			     fibnum, rt_numfibs));
@@ -1347,7 +1346,7 @@ void
 rt_newaddrmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
 {
 
-	rt_newaddrmsg_fib(cmd, ifa, error, rt, RTS_ALLFIBS);
+	rt_newaddrmsg_fib(cmd, ifa, error, rt, RT_ALL_FIBS);
 }
 
 /*
@@ -1818,7 +1817,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
 		if (namelen == 3)
 			fib = req->td->td_proc->p_fibnum;
 		else if (namelen == 4)
-			fib = (name[3] == -1) ?
+			fib = (name[3] == RT_ALL_FIBS) ?
 			    req->td->td_proc->p_fibnum : name[3];
 		else
 			return ((namelen < 3) ? EISDIR : ENOTDIR);


More information about the svn-src-all mailing list