Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9354e0ac authored by Maciej Żenczykowski's avatar Maciej Żenczykowski Committed by Greg Kroah-Hartman
Browse files

net: ipv6: support reporting otherwise unknown prefix flags in RTM_NEWPREFIX



[ Upstream commit bd4a816752bab609dd6d65ae021387beb9e2ddbd ]

Lorenzo points out that we effectively clear all unknown
flags from PIO when copying them to userspace in the netlink
RTM_NEWPREFIX notification.

We could fix this one at a time as new flags are defined,
or in one fell swoop - I choose the latter.

We could either define 6 new reserved flags (reserved1..6) and handle
them individually (and rename them as new flags are defined), or we
could simply copy the entire unmodified byte over - I choose the latter.

This unfortunately requires some anonymous union/struct magic,
so we add a static assert on the struct size for a little extra safety.

Cc: David Ahern <dsahern@kernel.org>
Cc: Lorenzo Colitti <lorenzo@google.com>
Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 053220aa
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -31,6 +31,9 @@ struct prefix_info {
	__u8			length;
	__u8			prefix_len;

	union __packed {
		__u8		flags;
		struct __packed {
#if defined(__BIG_ENDIAN_BITFIELD)
			__u8	onlink : 1,
			 	autoconf : 1,
@@ -42,6 +45,8 @@ struct prefix_info {
#else
#error "Please fix <asm/byteorder.h>"
#endif
		};
	};
	__be32			valid;
	__be32			prefered;
	__be32			reserved2;
@@ -49,6 +54,9 @@ struct prefix_info {
	struct in6_addr		prefix;
};

/* rfc4861 4.6.2: IPv6 PIO is 32 bytes in size */
static_assert(sizeof(struct prefix_info) == 32);

#include <linux/ipv6.h>
#include <linux/netdevice.h>
#include <net/if_inet6.h>
+0 −4
Original line number Diff line number Diff line
@@ -22,10 +22,6 @@
#define IF_RS_SENT	0x10
#define IF_READY	0x80000000

/* prefix flags */
#define IF_PREFIX_ONLINK	0x01
#define IF_PREFIX_AUTOCONF	0x02

enum {
	INET6_IFADDR_STATE_PREDAD,
	INET6_IFADDR_STATE_DAD,
+1 −5
Original line number Diff line number Diff line
@@ -5977,11 +5977,7 @@ static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
	pmsg->prefix_len = pinfo->prefix_len;
	pmsg->prefix_type = pinfo->type;
	pmsg->prefix_pad3 = 0;
	pmsg->prefix_flags = 0;
	if (pinfo->onlink)
		pmsg->prefix_flags |= IF_PREFIX_ONLINK;
	if (pinfo->autoconf)
		pmsg->prefix_flags |= IF_PREFIX_AUTOCONF;
	pmsg->prefix_flags = pinfo->flags;

	if (nla_put(skb, PREFIX_ADDRESS, sizeof(pinfo->prefix), &pinfo->prefix))
		goto nla_put_failure;