svn commit: r256625 - user/ae/inet6/sys/netinet6

Andrey V. Elsukov ae at FreeBSD.org
Wed Oct 16 13:07:06 UTC 2013


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


More information about the svn-src-user mailing list