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        bool                    parallel_ops;
  54        int                     (*pre_doit)(struct genl_ops *ops,
  55                                            struct sk_buff *skb,
  56                                            struct genl_info *info);
  57        void                    (*post_doit)(struct genl_ops *ops,
  58                                             struct sk_buff *skb,
  59                                             struct genl_info *info);
  60        struct nlattr **        attrbuf;        /* private */
  61        struct list_head        ops_list;       /* private */
  62        struct list_head        family_list;    /* private */
  63        struct list_head        mcast_groups;   /* private */
  64        struct module           *module;
  65};
  66
  67/**
  68 * struct genl_info - receiving information
  69 * @snd_seq: sending sequence number
  70 * @snd_portid: netlink portid of sender
  71 * @nlhdr: netlink message header
  72 * @genlhdr: generic netlink message header
  73 * @userhdr: user specific header
  74 * @attrs: netlink attributes
  75 * @_net: network namespace
  76 * @user_ptr: user pointers
  77 */
  78struct genl_info {
  79        u32                     snd_seq;
  80        u32                     snd_portid;
  81        struct nlmsghdr *       nlhdr;
  82        struct genlmsghdr *     genlhdr;
  83        void *                  userhdr;
  84        struct nlattr **        attrs;
  85#ifdef CONFIG_NET_NS
  86        struct net *            _net;
  87#endif
  88        void *                  user_ptr[2];
  89};
  90
  91static inline struct net *genl_info_net(struct genl_info *info)
  92{
  93        return read_pnet(&info->_net);
  94}
  95
  96static inline void genl_info_net_set(struct genl_info *info, struct net *net)
  97{
  98        write_pnet(&info->_net, net);
  99}
 100
 101/**
 102 * struct genl_ops - generic netlink operations
 103 * @cmd: command identifier
 104 * @internal_flags: flags used by the family
 105 * @flags: flags
 106 * @policy: attribute validation policy
 107 * @doit: standard command callback
 108 * @dumpit: callback for dumpers
 109 * @done: completion callback for dumps
 110 * @ops_list: operations list
 111 */
 112struct genl_ops {
 113        u8                      cmd;
 114        u8                      internal_flags;
 115        unsigned int            flags;
 116        const struct nla_policy *policy;
 117        int                    (*doit)(struct sk_buff *skb,
 118                                       struct genl_info *info);
 119        int                    (*dumpit)(struct sk_buff *skb,
 120                                         struct netlink_callback *cb);
 121        int                    (*done)(struct netlink_callback *cb);
 122        struct list_head        ops_list;
 123};
 124
 125extern int __genl_register_family(struct genl_family *family);
 126
 127static inline int genl_register_family(struct genl_family *family)
 128{
 129        family->module = THIS_MODULE;
 130        return __genl_register_family(family);
 131}
 132
 133extern int __genl_register_family_with_ops(struct genl_family *family,
 134        struct genl_ops *ops, size_t n_ops);
 135
 136static inline int genl_register_family_with_ops(struct genl_family *family,
 137        struct genl_ops *ops, size_t n_ops)
 138{
 139        family->module = THIS_MODULE;
 140        return __genl_register_family_with_ops(family, ops, n_ops);
 141}
 142
 143extern int genl_unregister_family(struct genl_family *family);
 144extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
 145extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
 146extern int genl_register_mc_group(struct genl_family *family,
 147                                  struct genl_multicast_group *grp);
 148extern void genl_unregister_mc_group(struct genl_family *family,
 149                                     struct genl_multicast_group *grp);
 150extern void genl_notify(struct sk_buff *skb, struct net *net, u32 portid,
 151                        u32 group, struct nlmsghdr *nlh, gfp_t flags);
 152
 153void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
 154                                struct genl_family *family, int flags, u8 cmd);
 155
 156/**
 157 * genlmsg_nlhdr - Obtain netlink header from user specified header
 158 * @user_hdr: user header as returned from genlmsg_put()
 159 * @family: generic netlink family
 160 *
 161 * Returns pointer to netlink header.
 162 */
 163static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
 164                                             struct genl_family *family)
 165{
 166        return (struct nlmsghdr *)((char *)user_hdr -
 167                                   family->hdrsize -
 168                                   GENL_HDRLEN -
 169                                   NLMSG_HDRLEN);
 170}
 171
 172/**
 173 * genl_dump_check_consistent - check if sequence is consistent and advertise if not
 174 * @cb: netlink callback structure that stores the sequence number
 175 * @user_hdr: user header as returned from genlmsg_put()
 176 * @family: generic netlink family
 177 *
 178 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
 179 * simpler to use with generic netlink.
 180 */
 181static inline void genl_dump_check_consistent(struct netlink_callback *cb,
 182                                              void *user_hdr,
 183                                              struct genl_family *family)
 184{
 185        nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
 186}
 187
 188/**
 189 * genlmsg_put_reply - Add generic netlink header to a reply message
 190 * @skb: socket buffer holding the message
 191 * @info: receiver info
 192 * @family: generic netlink family
 193 * @flags: netlink message flags
 194 * @cmd: generic netlink command
 195 *
 196 * Returns pointer to user specific header
 197 */
 198static inline void *genlmsg_put_reply(struct sk_buff *skb,
 199                                      struct genl_info *info,
 200                                      struct genl_family *family,
 201                                      int flags, u8 cmd)
 202{
 203        return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
 204                           flags, cmd);
 205}
 206
 207/**
 208 * genlmsg_end - Finalize a generic netlink message
 209 * @skb: socket buffer the message is stored in
 210 * @hdr: user specific header
 211 */
 212static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
 213{
 214        return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 215}
 216
 217/**
 218 * genlmsg_cancel - Cancel construction of a generic netlink message
 219 * @skb: socket buffer the message is stored in
 220 * @hdr: generic netlink message header
 221 */
 222static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
 223{
 224        if (hdr)
 225                nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 226}
 227
 228/**
 229 * genlmsg_multicast_netns - multicast a netlink message to a specific netns
 230 * @net: the net namespace
 231 * @skb: netlink message as socket buffer
 232 * @portid: own netlink portid to avoid sending to yourself
 233 * @group: multicast group id
 234 * @flags: allocation flags
 235 */
 236static inline int genlmsg_multicast_netns(struct net *net, struct sk_buff *skb,
 237                                          u32 portid, unsigned int group, gfp_t flags)
 238{
 239        return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
 240}
 241
 242/**
 243 * genlmsg_multicast - multicast a netlink message to the default netns
 244 * @skb: netlink message as socket buffer
 245 * @portid: own netlink portid to avoid sending to yourself
 246 * @group: multicast group id
 247 * @flags: allocation flags
 248 */
 249static inline int genlmsg_multicast(struct sk_buff *skb, u32 portid,
 250                                    unsigned int group, gfp_t flags)
 251{
 252        return genlmsg_multicast_netns(&init_net, skb, portid, group, flags);
 253}
 254
 255/**
 256 * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
 257 * @skb: netlink message as socket buffer
 258 * @portid: own netlink portid to avoid sending to yourself
 259 * @group: multicast group id
 260 * @flags: allocation flags
 261 *
 262 * This function must hold the RTNL or rcu_read_lock().
 263 */
 264int genlmsg_multicast_allns(struct sk_buff *skb, u32 portid,
 265                            unsigned int group, gfp_t flags);
 266
 267/**
 268 * genlmsg_unicast - unicast a netlink message
 269 * @skb: netlink message as socket buffer
 270 * @portid: netlink portid of the destination socket
 271 */
 272static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid)
 273{
 274        return nlmsg_unicast(net->genl_sock, skb, portid);
 275}
 276
 277/**
 278 * genlmsg_reply - reply to a request
 279 * @skb: netlink message to be sent back
 280 * @info: receiver information
 281 */
 282static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
 283{
 284        return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
 285}
 286
 287/**
 288 * gennlmsg_data - head of message payload
 289 * @gnlh: genetlink message header
 290 */
 291static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
 292{
 293        return ((unsigned char *) gnlh + GENL_HDRLEN);
 294}
 295
 296/**
 297 * genlmsg_len - length of message payload
 298 * @gnlh: genetlink message header
 299 */
 300static inline int genlmsg_len(const struct genlmsghdr *gnlh)
 301{
 302        struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
 303                                                        NLMSG_HDRLEN);
 304        return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
 305}
 306
 307/**
 308 * genlmsg_msg_size - length of genetlink message not including padding
 309 * @payload: length of message payload
 310 */
 311static inline int genlmsg_msg_size(int payload)
 312{
 313        return GENL_HDRLEN + payload;
 314}
 315
 316/**
 317 * genlmsg_total_size - length of genetlink message including padding
 318 * @payload: length of message payload
 319 */
 320static inline int genlmsg_total_size(int payload)
 321{
 322        return NLMSG_ALIGN(genlmsg_msg_size(payload));
 323}
 324
 325/**
 326 * genlmsg_new - Allocate a new generic netlink message
 327 * @payload: size of the message payload
 328 * @flags: the type of memory to allocate.
 329 */
 330static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
 331{
 332        return nlmsg_new(genlmsg_total_size(payload), flags);
 333}
 334
 335
 336#endif  /* __NET_GENERIC_NETLINK_H */
 337