Message ID | 20241024131807.0a6c07355832.I3df6aac71d38a5baa1c0a03d0c7e82d4395c030e@changeid (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Johannes Berg |
Headers | show |
Series | [RFC,1/2] net: netlink: add nla_get_*_default() accessors | expand |
On Thu, 2024-10-24 at 13:18 +0200, Johannes Berg wrote: > > +MAKE_NLA_GET_DEFAULT(u8, nla_get_u8); > +MAKE_NLA_GET_DEFAULT(u16, nla_get_u16); > +MAKE_NLA_GET_DEFAULT(u32, nla_get_u32); > +MAKE_NLA_GET_DEFAULT(u64, nla_get_u64); > +MAKE_NLA_GET_DEFAULT(unsigned long, nla_get_msecs); > +MAKE_NLA_GET_DEFAULT(s8, nla_get_s8); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_s16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_s32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_s64); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_le16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_le32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_le64); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_be16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_be32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_be64); > I obviously messed that up completely, but you get the point ... johannes
Johannes Berg <johannes@sipsolutions.net> writes: > From: Johannes Berg <johannes.berg@intel.com> > > There are quite a number of places that use patterns > such as > > if (attr) > val = nla_get_u16(attr); > else > val = DEFAULT; > > Add nla_get_u16_default() and friends like that to > not have to type this out all the time. > > Signed-off-by: Johannes Berg <johannes.berg@intel.com> I think this is an excellent idea! So typos/copy-paste errors aside: Acked-by: Toke Høiland-Jørgensen <toke@kernel.org>
On Thu, 24 Oct 2024 13:18:06 +0200 Johannes Berg wrote: > +#define MAKE_NLA_GET_DEFAULT(tp, fn) \ > +static inline tp fn##_default(const struct nlattr *nla, \ > + tp defvalue) \ > +{ \ > + if (!nla) \ > + return defvalue; \ > + return n(nla); \ > +} > + > +MAKE_NLA_GET_DEFAULT(u8, nla_get_u8); > +MAKE_NLA_GET_DEFAULT(u16, nla_get_u16); > +MAKE_NLA_GET_DEFAULT(u32, nla_get_u32); > +MAKE_NLA_GET_DEFAULT(u64, nla_get_u64); > +MAKE_NLA_GET_DEFAULT(unsigned long, nla_get_msecs); > +MAKE_NLA_GET_DEFAULT(s8, nla_get_s8); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_s16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_s32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_s64); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_le16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_le32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_le64); > +MAKE_NLA_GET_DEFAULT(s16, nla_get_be16); > +MAKE_NLA_GET_DEFAULT(s32, nla_get_be32); > +MAKE_NLA_GET_DEFAULT(s64, nla_get_be64); I'd vote to just spell out the accessors instead of hinding the definitions behind macros. Place them right after the existing nla_get_* definition to make it more likely people will notice them. Either way: Acked-by: Jakub Kicinski <kuba@kernel.org>
diff --git a/include/net/netlink.h b/include/net/netlink.h index db6af207287c..b15bd0437945 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h @@ -142,6 +142,8 @@ * nla_get_flag(nla) return 1 if flag is true * nla_get_msecs(nla) get payload for a msecs attribute * + * The same functions also exist with _default(). + * * Attribute Misc: * nla_memcpy(dest, nla, count) copy attribute into memory * nla_memcmp(nla, data, size) compare attribute with memory area @@ -1867,6 +1869,31 @@ static inline unsigned long nla_get_msecs(const struct nlattr *nla) return msecs_to_jiffies((unsigned long) msecs); } +#define MAKE_NLA_GET_DEFAULT(tp, fn) \ +static inline tp fn##_default(const struct nlattr *nla, \ + tp defvalue) \ +{ \ + if (!nla) \ + return defvalue; \ + return n(nla); \ +} + +MAKE_NLA_GET_DEFAULT(u8, nla_get_u8); +MAKE_NLA_GET_DEFAULT(u16, nla_get_u16); +MAKE_NLA_GET_DEFAULT(u32, nla_get_u32); +MAKE_NLA_GET_DEFAULT(u64, nla_get_u64); +MAKE_NLA_GET_DEFAULT(unsigned long, nla_get_msecs); +MAKE_NLA_GET_DEFAULT(s8, nla_get_s8); +MAKE_NLA_GET_DEFAULT(s16, nla_get_s16); +MAKE_NLA_GET_DEFAULT(s32, nla_get_s32); +MAKE_NLA_GET_DEFAULT(s64, nla_get_s64); +MAKE_NLA_GET_DEFAULT(s16, nla_get_le16); +MAKE_NLA_GET_DEFAULT(s32, nla_get_le32); +MAKE_NLA_GET_DEFAULT(s64, nla_get_le64); +MAKE_NLA_GET_DEFAULT(s16, nla_get_be16); +MAKE_NLA_GET_DEFAULT(s32, nla_get_be32); +MAKE_NLA_GET_DEFAULT(s64, nla_get_be64); + /** * nla_get_in_addr - return payload of IPv4 address attribute * @nla: IPv4 address netlink attribute