Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Aug 2014 02:24:52 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r269454 - stable/10/lib/libc/net
Message-ID:  <201408030224.s732OqBA026782@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Sun Aug  3 02:24:52 2014
New Revision: 269454
URL: http://svnweb.freebsd.org/changeset/base/269454

Log:
  MFC 264162: Accept RFC 2292 option values so that RFC 2292 compliant
  programs that are unaware of RFC 3542 can construct control messages.
  
  Obtained from:	Juniper Networks, Inc.

Modified:
  stable/10/lib/libc/net/ip6opt.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/net/ip6opt.c
==============================================================================
--- stable/10/lib/libc/net/ip6opt.c	Sun Aug  3 01:51:48 2014	(r269453)
+++ stable/10/lib/libc/net/ip6opt.c	Sun Aug  3 02:24:52 2014	(r269454)
@@ -45,6 +45,18 @@ __FBSDID("$FreeBSD$");
 static int ip6optlen(u_int8_t *opt, u_int8_t *lim);
 static void inet6_insert_padopt(u_char *p, int len);
 
+#ifndef IPV6_2292HOPOPTS
+#define	IPV6_2292HOPOPTS	22
+#endif
+#ifndef IPV6_2292DSTOPTS
+#define	IPV6_2292DSTOPTS	23
+#endif
+
+#define	is_ipv6_hopopts(x)	\
+	((x) == IPV6_HOPOPTS || (x) == IPV6_2292HOPOPTS)
+#define	is_ipv6_dstopts(x)	\
+	((x) == IPV6_DSTOPTS || (x) == IPV6_2292DSTOPTS)
+
 /*
  * This function returns the number of bytes required to hold an option
  * when it is stored as ancillary data, including the cmsghdr structure
@@ -72,9 +84,9 @@ inet6_option_init(void *bp, struct cmsgh
 	struct cmsghdr *ch = (struct cmsghdr *)bp;
 
 	/* argument validation */
-	if (type != IPV6_HOPOPTS && type != IPV6_DSTOPTS)
+	if (!is_ipv6_hopopts(type) && !is_ipv6_dstopts(type))
 		return(-1);
-	
+
 	ch->cmsg_level = IPPROTO_IPV6;
 	ch->cmsg_type = type;
 	ch->cmsg_len = CMSG_LEN(0);
@@ -234,8 +246,8 @@ inet6_option_next(const struct cmsghdr *
 	u_int8_t *lim;
 
 	if (cmsg->cmsg_level != IPPROTO_IPV6 ||
-	    (cmsg->cmsg_type != IPV6_HOPOPTS &&
-	     cmsg->cmsg_type != IPV6_DSTOPTS))
+	    (!is_ipv6_hopopts(cmsg->cmsg_type) &&
+	     !is_ipv6_dstopts(cmsg->cmsg_type)))
 		return(-1);
 
 	/* message length validation */
@@ -290,8 +302,8 @@ inet6_option_find(const struct cmsghdr *
 	u_int8_t *optp, *lim;
 
 	if (cmsg->cmsg_level != IPPROTO_IPV6 ||
-	    (cmsg->cmsg_type != IPV6_HOPOPTS &&
-	     cmsg->cmsg_type != IPV6_DSTOPTS))
+	    (!is_ipv6_hopopts(cmsg->cmsg_type) &&
+	     !is_ipv6_dstopts(cmsg->cmsg_type)))
 		return(-1);
 
 	/* message length validation */



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