svn commit: r285107 - head/sys/netinet6

Andrey V. Elsukov ae at FreeBSD.org
Fri Jul 3 19:01:39 UTC 2015


Author: ae
Date: Fri Jul  3 19:01:38 2015
New Revision: 285107
URL: https://svnweb.freebsd.org/changeset/base/285107

Log:
  Keep IPv6 address specified by IPV6_PKTINFO socket option in kernel
  internal form to be able handle link-local IPv6 addresses.
  
  Reported by:	kp
  Tested by:	kp

Modified:
  head/sys/netinet6/ip6_output.c

Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c	Fri Jul  3 18:39:25 2015	(r285106)
+++ head/sys/netinet6/ip6_output.c	Fri Jul  3 19:01:38 2015	(r285107)
@@ -2189,12 +2189,14 @@ ip6_getpcbopt(struct ip6_pktopts *pktopt
 
 	switch (optname) {
 	case IPV6_PKTINFO:
-		if (pktopt && pktopt->ip6po_pktinfo)
-			optdata = (void *)pktopt->ip6po_pktinfo;
-		else {
+		optdata = (void *)&null_pktinfo;
+		if (pktopt && pktopt->ip6po_pktinfo) {
+			bcopy(pktopt->ip6po_pktinfo, &null_pktinfo,
+			    sizeof(null_pktinfo));
+			in6_clearscope(&null_pktinfo.ipi6_addr);
+		} else {
 			/* XXX: we don't have to do this every time... */
 			bzero(&null_pktinfo, sizeof(null_pktinfo));
-			optdata = (void *)&null_pktinfo;
 		}
 		optdatalen = sizeof(struct in6_pktinfo);
 		break;
@@ -2566,6 +2568,7 @@ ip6_setpktopt(int optname, u_char *buf, 
 		    !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
 			struct in6_ifaddr *ia;
 
+			in6_setscope(&pktinfo->ipi6_addr, ifp, NULL);
 			ia = in6ifa_ifpwithaddr(ifp, &pktinfo->ipi6_addr);
 			if (ia == NULL)
 				return (EADDRNOTAVAIL);


More information about the svn-src-all mailing list