[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZNXYzJKTENOO/OgG@nanopsycho>
Date: Fri, 11 Aug 2023 08:44:28 +0200
From: Jiri Pirko <jiri@...nulli.us>
To: Jakub Kicinski <kuba@...nel.org>
Cc: davem@...emloft.net, netdev@...r.kernel.org, edumazet@...gle.com,
pabeni@...hat.com, johannes@...solutions.net
Subject: Re: [PATCH net-next v2 07/10] genetlink: add genlmsg_iput() API
Fri, Aug 11, 2023 at 01:38:42AM CEST, kuba@...nel.org wrote:
>Add some APIs and helpers required for convenient construction
>of replies and notifications based on struct genl_info.
>
>Signed-off-by: Jakub Kicinski <kuba@...nel.org>
>---
> include/net/genetlink.h | 54 ++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 53 insertions(+), 1 deletion(-)
>
>diff --git a/include/net/genetlink.h b/include/net/genetlink.h
>index 6b858c4cba5b..e18a4c0d69ee 100644
>--- a/include/net/genetlink.h
>+++ b/include/net/genetlink.h
>@@ -113,7 +113,7 @@ struct genl_info {
> struct netlink_ext_ack *extack;
> };
>
>-static inline struct net *genl_info_net(struct genl_info *info)
>+static inline struct net *genl_info_net(const struct genl_info *info)
> {
> return read_pnet(&info->_net);
> }
>@@ -270,6 +270,32 @@ genl_info_dump(struct netlink_callback *cb)
> return &genl_dumpit_info(cb)->info;
> }
>
>+/**
>+ * genl_info_init_ntf() - initialize genl_info for notifications
>+ * @info: genl_info struct to set up
>+ * @family: pointer to the genetlink family
>+ * @cmd: command to be used in the notification
>+ *
>+ * Initialize a locally declared struct genl_info to pass to various APIs.
>+ * Intended to be used when creating notifications.
>+ */
>+static inline void
>+genl_info_init_ntf(struct genl_info *info, const struct genl_family *family,
>+ u8 cmd)
>+{
>+ struct genlmsghdr *hdr = (void *) &info->user_ptr[0];
>+
>+ memset(info, 0, sizeof(*info));
>+ info->family = family;
>+ info->genlhdr = hdr;
>+ hdr->cmd = cmd;
>+}
This looks good. Please see my comment to genl_info_is_ntf() in the
reply to the last patch. Anyway, if you decide to keep it, I'm fine:
Reviewed-by: Jiri Pirko <jiri@...dia.com>
>+
>+static inline bool genl_info_is_ntf(const struct genl_info *info)
>+{
>+ return !info->nlhdr;
>+}
>+
> int genl_register_family(struct genl_family *family);
> int genl_unregister_family(const struct genl_family *family);
> void genl_notify(const struct genl_family *family, struct sk_buff *skb,
>@@ -278,6 +304,32 @@ void genl_notify(const struct genl_family *family, struct sk_buff *skb,
> void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
> const struct genl_family *family, int flags, u8 cmd);
>
>+static inline void *
>+__genlmsg_iput(struct sk_buff *skb, const struct genl_info *info, int flags)
>+{
>+ return genlmsg_put(skb, info->snd_portid, info->snd_seq, info->family,
>+ flags, info->genlhdr->cmd);
>+}
>+
>+/**
>+ * genlmsg_iput - start genetlink message based on genl_info
>+ * @skb: skb in which message header will be placed
>+ * @info: genl_info as provided to do/dump handlers
>+ *
>+ * Convenience wrapper which starts a genetlink message based on
>+ * information in user request. @info should be either the struct passed
>+ * by genetlink core to do/dump handlers (when constructing replies to
>+ * such requests) or a struct initialized by genl_info_init_ntf()
>+ * when constructing notifications.
>+ *
>+ * Returns pointer to new genetlink header.
>+ */
>+static inline void *
>+genlmsg_iput(struct sk_buff *skb, const struct genl_info *info)
>+{
>+ return __genlmsg_iput(skb, info, 0);
>+}
>+
> /**
> * genlmsg_nlhdr - Obtain netlink header from user specified header
> * @user_hdr: user header as returned from genlmsg_put()
>--
>2.41.0
>
Powered by blists - more mailing lists