On Mon, Oct 05, 2020 at 09:05:23PM +0200, Johannes Berg wrote: > On Mon, 2020-10-05 at 08:57 -0700, Jakub Kicinski wrote: > > > +static int nla_validate_mask(const struct nla_policy *pt, > > + const struct nlattr *nla, > > + struct netlink_ext_ack *extack) > > +{ > > + u64 value; > > + > > + switch (pt->type) { > > + case NLA_U8: > > + value = nla_get_u8(nla); > > + break; > > + case NLA_U16: > > + value = nla_get_u16(nla); > > + break; > > + case NLA_U32: > > + value = nla_get_u32(nla); > > + break; > > + case NLA_U64: > > + value = nla_get_u64(nla); > > + break; > > + default: > > + return -EINVAL; > > + } > > + > > + if (value & ~(u64)pt->mask) { > > + NL_SET_ERR_MSG_ATTR(extack, nla, "reserved bit set"); > > + return -EINVAL; > > You had an export of the valid bits there in ethtool, using the cookie. > Just pointing out you lost it now. I'm not sure I like using the cookie, > that seems a bit strange, but we could easily define a different attr?
The idea behind the cookie was that if new userspace sends a request with multiple flags which may not be supported by an old kernel, getting only -EOPNOTSUPP (and badattr pointing to the flags) would not be very helpful as multiple iteration would be necessary to find out which flags are supported and which not. > OTOH, one can always query the policy export too (which hopefully got > wired up) so it wouldn't really matter much. But yes, if userspace can get supported flags from policy dump, it can check them in advance and either bail out (if one of essential flags is unsupported) or send only supported flags. I'm not exactly happy with the prospect of having to do a full policy dump before each such request, thought. Michal