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