Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Oct 2013 13:07:06 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256625 - user/ae/inet6/sys/netinet6
Message-ID:  <201310161307.r9GD76Zs022729@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Wed Oct 16 13:07:06 2013
New Revision: 256625
URL: http://svnweb.freebsd.org/changeset/base/256625

Log:
  Add additional error codes for IPV6_PKTINFO socket option handling
  corresponding to RFC3542:
  * Return ENETDOWN when interface specified by ipi6_ifindex is not
    enabled for IPv6 use.
  * Return EADDRNOTAVAIL when ipi6_ifindex specifies an interface but the
    address ipi6_addr is not available for use on that interface.
  * Return EINVAL when ipi6_addr is multicast address.

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

Modified: user/ae/inet6/sys/netinet6/ip6_output.c
==============================================================================
--- user/ae/inet6/sys/netinet6/ip6_output.c	Wed Oct 16 12:18:44 2013	(r256624)
+++ user/ae/inet6/sys/netinet6/ip6_output.c	Wed Oct 16 13:07:06 2013	(r256625)
@@ -2693,7 +2693,8 @@ ip6_setpktopt(int optname, u_char *buf, 
 		    sticky && !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
 			return (EINVAL);
 		}
-
+		if (IN6_IS_ADDR_MULTICAST(&pktinfo->ipi6_addr))
+			return (EINVAL);
 		/* validate the interface index if specified. */
 		if (pktinfo->ipi6_ifindex > V_if_index ||
 		    pktinfo->ipi6_ifindex < 0) {
@@ -2704,7 +2705,19 @@ ip6_setpktopt(int optname, u_char *buf, 
 			if (ifp == NULL)
 				return (ENXIO);
 		}
-
+		if (ifp != NULL && (
+		    ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED))
+			return (ENETDOWN);
+
+		if (ifp != NULL &&
+		    !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
+			struct in6_ifaddr *ia;
+
+			ia = in6ifa_ifpwithaddr(ifp, &pktinfo->ipi6_addr);
+			if (ia == NULL)
+				return (EADDRNOTAVAIL);
+			ifa_free(&ia->ia_ifa);
+		}
 		/*
 		 * We store the address anyway, and let in6_selectsrc()
 		 * validate the specified address.  This is because ipi6_addr



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