mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
genetlink: add genlmsg_iput() API
Add some APIs and helpers required for convenient construction of replies and notifications based on struct genl_info. Reviewed-by: Jiri Pirko <jiri@nvidia.com> Link: https://lore.kernel.org/r/20230814214723.2924989-8-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
5c670a010d
commit
5aa51d9f88
@ -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;
|
||||
}
|
||||
|
||||
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()
|
||||
|
Loading…
Reference in New Issue
Block a user