Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 May 2014 20:41:40 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r265711 - stable/10/sys/net
Message-ID:  <201405082041.s48Kfenn016182@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Thu May  8 20:41:39 2014
New Revision: 265711
URL: http://svnweb.freebsd.org/changeset/base/265711

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/10/sys/net/radix_mpath.c
  stable/10/sys/net/route.c
  stable/10/sys/net/route.h
  stable/10/sys/net/rtsock.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/net/radix_mpath.c
==============================================================================
--- stable/10/sys/net/radix_mpath.c	Thu May  8 20:33:47 2014	(r265710)
+++ stable/10/sys/net/radix_mpath.c	Thu May  8 20:41:39 2014	(r265711)
@@ -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/10/sys/net/route.c
==============================================================================
--- stable/10/sys/net/route.c	Thu May  8 20:33:47 2014	(r265710)
+++ stable/10/sys/net/route.c	Thu May  8 20:41:39 2014	(r265711)
@@ -1532,7 +1532,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 {
@@ -1581,10 +1581,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 {
@@ -1598,13 +1598,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);
@@ -1753,7 +1751,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/10/sys/net/route.h
==============================================================================
--- stable/10/sys/net/route.h	Thu May  8 20:33:47 2014	(r265710)
+++ stable/10/sys/net/route.h	Thu May  8 20:41:39 2014	(r265711)
@@ -83,7 +83,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 */
 
 /*
  * We distinguish between routes to hosts and routes to networks,

Modified: stable/10/sys/net/rtsock.c
==============================================================================
--- stable/10/sys/net/rtsock.c	Thu May  8 20:33:47 2014	(r265710)
+++ stable/10/sys/net/rtsock.c	Thu May  8 20:41:39 2014	(r265711)
@@ -161,7 +161,6 @@ int	(*carp_get_vhid_p)(struct ifaddr *);
  * 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 */
@@ -1281,7 +1280,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);
@@ -1299,7 +1298,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);
 }
 
 /*
@@ -1395,7 +1394,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));
@@ -1410,7 +1409,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);
 }
 
 /*
@@ -1907,7 +1906,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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405082041.s48Kfenn016182>