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

Reply via email to