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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"