linux/include/net/genetlink.h
<<
>>
Prefs
   1#ifndef __NET_GENERIC_NETLINK_H
   2#define __NET_GENERIC_NETLINK_H
   3
   4#include <linux/genetlink.h>
   5#include <net/netlink.h>
   6#include <net/net_namespace.h>
   7
   8#define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN)
   9
  10/**
  11 * struct genl_multicast_group - generic netlink multicast group
  12 * @name: name of the multicast group, names are per-family
  13 * @id: multicast group ID, assigned by the core, to use with
  14 *      genlmsg_multicast().
  15 * @list: list entry for linking
  16 * @family: pointer to family, need not be set before registering
  17 */
  18struct genl_multicast_group {
  19        struct genl_family      *family;        /* private */
  20        struct list_head        list;           /* private */
  21        char                    name[GENL_NAMSIZ];
  22        u32                     id;
  23};
  24
  25struct genl_ops;
  26struct genl_info;
  27
  28/**
  29 * struct genl_family - generic netlink family
  30 * @id: protocol family idenfitier
  31 * @hdrsize: length of user specific header in bytes
  32 * @name: name of family
  33 * @version: protocol version
  34 * @maxattr: maximum number of attributes supported
  35 * @netnsok: set to true if the family can handle network
  36 *      namespaces and should be presented in all of them
  37 * @pre_doit: called before an operation's doit callback, it may
  38 *      do additional, common, filtering and return an error
  39 * @post_doit: called after an operation's doit callback, it may
  40 *      undo operations done by pre_doit, for example release locks
  41 * @attrbuf: buffer to store parsed attributes
  42 * @ops_list: list of all assigned operations
  43 * @family_list: family list
  44 * @mcast_groups: multicast groups list
  45 */
  46struct genl_family {
  47        unsigned int            id;
  48        unsigned int            hdrsize;
  49        char                    name[GENL_NAMSIZ];
  50        unsigned int            version;
  51        unsigned int            maxattr;
  52        bool                    netnsok;
  53        int                     (*pre_doit)(struct genl_ops *ops,
  54                                            struct sk_buff *skb,
  55                                            struct genl_info *info);
  56        void                    (*post_doit)(struct genl_ops *ops,
  57                                             struct sk_buff *skb,
  58                                             struct genl_info *info);
  59        struct nlattr **        attrbuf;        /* private */
  60        struct list_head        ops_list;       /* private */
  61        struct list_head        family_list;    /* private */
  62        struct list_head        mcast_groups;   /* private */
  63};
  64
  65/**
  66 * struct genl_info - receiving information
  67 * @snd_seq: sending sequence number
  68 * @snd_pid: netlink pid of sender
  69 * @nlhdr: netlink message header
  70 * @genlhdr: generic netlink message header
  71 * @userhdr: user specific header
  72 * @attrs: netlink attributes
  73 * @_net: network namespace
  74 * @user_ptr: user pointers
  75 */
  76struct genl_info {
  77        u32                     snd_seq;
  78        u32                     snd_pid;
  79        struct nlmsghdr *       nlhdr;
  80        struct genlmsghdr *     genlhdr;
  81        void *                  userhdr;
  82        struct nlattr **        attrs;
  83#ifdef CONFIG_NET_NS
  84        struct net *            _net;
  85#endif
  86        void *                  user_ptr[2];
  87};
  88
  89static inline struct net *genl_info_net(struct genl_info *info)
  90{
  91        return read_pnet(&info->_net);
  92}
  93
  94static inline void genl_info_net_set(struct genl_info *info, struct net *net)
  95{
  96        write_pnet(&info->_net, net);
  97}
  98
  99/**
 100 * struct genl_ops - generic netlink operations
 101 * @cmd: command identifier
 102 * @internal_flags: flags used by the family
 103 * @flags: flags
 104 * @policy: attribute validation policy
 105 * @doit: standard command callback
 106 * @dumpit: callback for dumpers
 107 * @done: completion callback for dumps
 108 * @ops_list: operations list
 109 */
 110struct genl_ops {
 111        u8                      cmd;
 112        u8                      internal_flags;
 113        unsigned int            flags;
 114        const struct nla_policy *policy;
 115        int                    (*doit)(struct sk_buff *skb,
 116                                       struct genl_info *info);
 117        int                    (*dumpit)(struct sk_buff *skb,
 118                                         struct netlink_callback *cb);
 119        int                    (*done)(struct netlink_callback *cb);
 120        struct list_head        ops_list;
 121};
 122
 123extern int genl_register_family(struct genl_family *family);
 124extern int genl_register_family_with_ops(struct genl_family *family,
 125        struct genl_ops *ops, size_t n_ops);
 126extern int genl_unregister_family(struct genl_family *family);
 127extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
 128extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
 129extern int genl_register_mc_group(struct genl_family *family,
 130                                  struct genl_multicast_group *grp);
 131extern void genl_unregister_mc_group(struct genl_family *family,
 132                                     struct genl_multicast_group *grp);
 133extern void genl_notify(struct sk_buff *skb, struct net *net, u32 pid,
 134                        u32 group, struct nlmsghdr *nlh, gfp_t flags);
 135
 136void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
 137                                struct genl_family *family, int flags, u8 cmd);
 138
 139/**
 140 * genlmsg_nlhdr - Obtain netlink header from user specified header
 141 * @user_hdr: user header as returned from genlmsg_put()
 142 * @family: generic netlink family
 143 *
 144 * Returns pointer to netlink header.
 145 */
 146static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
 147                                             struct genl_family *family)
 148{
 149        return (struct nlmsghdr *)((char *)user_hdr -
 150                                   family->hdrsize -
 151                                   GENL_HDRLEN -
 152                                   NLMSG_HDRLEN);
 153}
 154
 155/**
 156 * genl_dump_check_consistent - check if sequence is consistent and advertise if not
 157 * @cb: netlink callback structure that stores the sequence number
 158 * @user_hdr: user header as returned from genlmsg_put()
 159 * @family: generic netlink family
 160 *
 161 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
 162 * simpler to use with generic netlink.
 163 */
 164static inline void genl_dump_check_consistent(struct netlink_callback *cb,
 165                                              void *user_hdr,
 166                                              struct genl_family *family)
 167{
 168        nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
 169}
 170
 171/**
 172 * genlmsg_put_reply - Add generic netlink header to a reply message
 173 * @skb: socket buffer holding the message
 174 * @info: receiver info
 175 * @family: generic netlink family
 176 * @flags: netlink message flags
 177 * @cmd: generic netlink command
 178 *
 179 * Returns pointer to user specific header
 180 */
 181static inline void *genlmsg_put_reply(struct sk_buff *skb,
 182                                      struct genl_info *info,
 183                                      struct genl_family *family,
 184                                      int flags, u8 cmd)
 185{
 186        return genlmsg_put(skb, info->snd_pid, info->snd_seq, family,
 187                           flags, cmd);
 188}
 189
 190/**
 191 * genlmsg_end - Finalize a generic netlink message
 192 * @skb: socket buffer the message is stored in
 193 * @hdr: user specific header
 194 */
 195static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
 196{
 197        return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 198}
 199
 200/**
 201 * genlmsg_cancel - Cancel construction of a generic netlink message
 202 * @skb: socket buffer the message is stored in
 203 * @hdr: generic netlink message header
 204 */
 205static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
 206{
 207        if (hdr)
 208                nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 209}
 210
 211/**
 212 * genlmsg_multicast_netns - multicast a netlink message to a specific netns
 213 * @net: the net namespace
 214 * @skb: netlink message as socket buffer
 215 * @pid: own netlink pid to avoid sending to yourself
 216 * @group: multicast group id
 217 * @flags: allocation flags
 218 */
 219static inline int genlmsg_multicast_netns(struct net *net, struct sk_buff *skb,
 220                                          u32 pid, unsigned int group, gfp_t flags)
 221{
 222        return nlmsg_multicast(net->genl_sock, skb, pid, group, flags);
 223}
 224
 225/**
 226 * genlmsg_multicast - multicast a netlink message to the default netns
 227 * @skb: netlink message as socket buffer
 228 * @pid: own netlink pid to avoid sending to yourself
 229 * @group: multicast group id
 230 * @flags: allocation flags
 231 */
 232static inline int genlmsg_multicast(struct sk_buff *skb, u32 pid,
 233                                    unsigned int group, gfp_t flags)
 234{
 235        return genlmsg_multicast_netns(&init_net, skb, pid, group, flags);
 236}
 237
 238/**
 239 * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
 240 * @skb: netlink message as socket buffer
 241 * @pid: own netlink pid to avoid sending to yourself
 242 * @group: multicast group id
 243 * @flags: allocation flags
 244 *
 245 * This function must hold the RTNL or rcu_read_lock().
 246 */
 247int genlmsg_multicast_allns(struct sk_buff *skb, u32 pid,
 248                            unsigned int group, gfp_t flags);
 249
 250/**
 251 * genlmsg_unicast - unicast a netlink message
 252 * @skb: netlink message as socket buffer
 253 * @pid: netlink pid of the destination socket
 254 */
 255static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 pid)
 256{
 257        return nlmsg_unicast(net->genl_sock, skb, pid);
 258}
 259
 260/**
 261 * genlmsg_reply - reply to a request
 262 * @skb: netlink message to be sent back
 263 * @info: receiver information
 264 */
 265static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
 266{
 267        return genlmsg_unicast(genl_info_net(info), skb, info->snd_pid);
 268}
 269
 270/**
 271 * gennlmsg_data - head of message payload
 272 * @gnlh: genetlink message header
 273 */
 274static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
 275{
 276        return ((unsigned char *) gnlh + GENL_HDRLEN);
 277}
 278
 279/**
 280 * genlmsg_len - length of message payload
 281 * @gnlh: genetlink message header
 282 */
 283static inline int genlmsg_len(const struct genlmsghdr *gnlh)
 284{
 285        struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
 286                                                        NLMSG_HDRLEN);
 287        return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
 288}
 289
 290/**
 291 * genlmsg_msg_size - length of genetlink message not including padding
 292 * @payload: length of message payload
 293 */
 294static inline int genlmsg_msg_size(int payload)
 295{
 296        return GENL_HDRLEN + payload;
 297}
 298
 299/**
 300 * genlmsg_total_size - length of genetlink message including padding
 301 * @payload: length of message payload
 302 */
 303static inline int genlmsg_total_size(int payload)
 304{
 305        return NLMSG_ALIGN(genlmsg_msg_size(payload));
 306}
 307
 308/**
 309 * genlmsg_new - Allocate a new generic netlink message
 310 * @payload: size of the message payload
 311 * @flags: the type of memory to allocate.
 312 */
 313static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
 314{
 315        return nlmsg_new(genlmsg_total_size(payload), flags);
 316}
 317
 318
 319#endif  /* __NET_GENERIC_NETLINK_H */
 320
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.