svn commit: r257032 - user/ae/inet6/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Thu Oct 24 00:53:10 UTC 2013
Author: ae
Date: Thu Oct 24 00:53:09 2013
New Revision: 257032
URL: http://svnweb.freebsd.org/changeset/base/257032
Log:
Scope related cleanup in rip6_connect():
* remove sa6_embedscope() and in6_setscope() calls;
* use sa6_checkzone() to check sin6_scope_id for correctness;
* when laddr or faddr is from link-local scope, initialize in6p_zoneid.
Modified:
user/ae/inet6/sys/netinet6/raw_ip6.c
Modified: user/ae/inet6/sys/netinet6/raw_ip6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/raw_ip6.c Thu Oct 24 00:48:31 2013 (r257031)
+++ user/ae/inet6/sys/netinet6/raw_ip6.c Thu Oct 24 00:53:09 2013 (r257032)
@@ -763,7 +763,7 @@ rip6_connect(struct socket *so, struct s
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)nam;
struct in6_addr in6a;
struct ifnet *ifp = NULL;
- int error = 0, scope_ambiguous = 0;
+ int error = 0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip6_connect: inp == NULL"));
@@ -774,18 +774,8 @@ rip6_connect(struct socket *so, struct s
return (EADDRNOTAVAIL);
if (addr->sin6_family != AF_INET6)
return (EAFNOSUPPORT);
-
- /*
- * Application should provide a proper zone ID or the use of default
- * zone IDs should be enabled. Unfortunately, some applications do
- * not behave as it should, so we need a workaround. Even if an
- * appropriate ID is not determined, we'll see if we can determine
- * the outgoing interface. If we can, determine the zone ID based on
- * the interface below.
- */
- if (addr->sin6_scope_id == 0 && !V_ip6_use_defzone)
- scope_ambiguous = 1;
- if ((error = sa6_embedscope(addr, V_ip6_use_defzone)) != 0)
+ error = sa6_checkzone(addr);
+ if (error != 0)
return (error);
INP_INFO_WLOCK(&V_ripcbinfo);
@@ -798,16 +788,12 @@ rip6_connect(struct socket *so, struct s
INP_INFO_WUNLOCK(&V_ripcbinfo);
return (error);
}
-
- /* XXX: see above */
- if (ifp && scope_ambiguous &&
- (error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
- INP_WUNLOCK(inp);
- INP_INFO_WUNLOCK(&V_ripcbinfo);
- return (error);
- }
inp->in6p_faddr = addr->sin6_addr;
inp->in6p_laddr = in6a;
+ if (IN6_IS_ADDR_LINKLOCAL(&inp->in6p_faddr) ||
+ IN6_IS_ADDR_LINKLOCAL(&inp->in6p_laddr))
+ inp->in6p_zoneid = in6_getscopezone(ifp,
+ IPV6_ADDR_SCOPE_LINKLOCAL);
soisconnected(so);
INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&V_ripcbinfo);
More information about the svn-src-user
mailing list