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