Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Oct 2013 11:51:36 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256731 - user/ae/inet6/sys/netinet6
Message-ID:  <201310181151.r9IBpaOa015963@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Fri Oct 18 11:51:36 2013
New Revision: 256731
URL: http://svnweb.freebsd.org/changeset/base/256731

Log:
  Scope related cleanup in icmp6_redirect_input()
  
  * Don't use in6_setscope(). We don't embed scope zones, thus these checks
  are useless.
  * Move check for multicast dst. It can be checked earlier.
  * Fill sin6_scope_id before pfctlinput(). It used in the PCB code.

Modified:
  user/ae/inet6/sys/netinet6/icmp6.c

Modified: user/ae/inet6/sys/netinet6/icmp6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/icmp6.c	Fri Oct 18 11:26:40 2013	(r256730)
+++ user/ae/inet6/sys/netinet6/icmp6.c	Fri Oct 18 11:51:36 2013	(r256731)
@@ -2300,11 +2300,6 @@ icmp6_redirect_input(struct mbuf *m, int
 	redtgt6 = nd_rd->nd_rd_target;
 	reddst6 = nd_rd->nd_rd_dst;
 
-	if (in6_setscope(&redtgt6, m->m_pkthdr.rcvif, NULL) ||
-	    in6_setscope(&reddst6, m->m_pkthdr.rcvif, NULL)) {
-		goto freeit;
-	}
-
 	/* validation */
 	if (!IN6_IS_ADDR_LINKLOCAL(&src6)) {
 		nd6log((LOG_ERR,
@@ -2320,7 +2315,14 @@ icmp6_redirect_input(struct mbuf *m, int
 		    ip6_sprintf(ip6buf, &src6), ip6->ip6_hlim));
 		goto bad;
 	}
-    {
+	if (IN6_IS_ADDR_MULTICAST(&reddst6)) {
+		nd6log((LOG_ERR,
+		    "ICMP6 redirect rejected; "
+		    "redirect dst must be unicast: %s\n",
+		    icmp6_redirect_diag(&src6, &reddst6, &redtgt6)));
+		goto bad;
+	}
+	if (!IN6_IS_ADDR_LINKLOCAL(&reddst6)) {
 	/* ip6->ip6_src must be equal to gw for icmp6->icmp6_reddst */
 	struct sockaddr_in6 sin6;
 	struct in6_addr *gw6;
@@ -2362,13 +2364,6 @@ icmp6_redirect_input(struct mbuf *m, int
 	RTFREE_LOCKED(rt);
 	rt = NULL;
     }
-	if (IN6_IS_ADDR_MULTICAST(&reddst6)) {
-		nd6log((LOG_ERR,
-		    "ICMP6 redirect rejected; "
-		    "redirect dst must be unicast: %s\n",
-		    icmp6_redirect_diag(&src6, &reddst6, &redtgt6)));
-		goto bad;
-	}
 
 	is_router = is_onlink = 0;
 	if (IN6_IS_ADDR_LINKLOCAL(&redtgt6))
@@ -2441,6 +2436,7 @@ icmp6_redirect_input(struct mbuf *m, int
 	sdst.sin6_family = AF_INET6;
 	sdst.sin6_len = sizeof(struct sockaddr_in6);
 	bcopy(&reddst6, &sdst.sin6_addr, sizeof(struct in6_addr));
+	sdst.sin6_scope_id = in6_getscopezone(ifp, in6_addrscope(&reddst6));
 	pfctlinput(PRC_REDIRECT_HOST, (struct sockaddr *)&sdst);
 #ifdef IPSEC
 	key_sa_routechange((struct sockaddr *)&sdst);



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