home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / genetlink.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  4.0 KB  |  154 lines

  1. #ifndef __NET_GENERIC_NETLINK_H
  2. #define __NET_GENERIC_NETLINK_H
  3.  
  4. #include <linux/genetlink.h>
  5. #include <net/netlink.h>
  6.  
  7. /**
  8.  * struct genl_family - generic netlink family
  9.  * @id: protocol family idenfitier
  10.  * @hdrsize: length of user specific header in bytes
  11.  * @name: name of family
  12.  * @version: protocol version
  13.  * @maxattr: maximum number of attributes supported
  14.  * @attrbuf: buffer to store parsed attributes
  15.  * @ops_list: list of all assigned operations
  16.  * @family_list: family list
  17.  */
  18. struct genl_family
  19. {
  20.     unsigned int        id;
  21.     unsigned int        hdrsize;
  22.     char            name[GENL_NAMSIZ];
  23.     unsigned int        version;
  24.     unsigned int        maxattr;
  25.     struct nlattr **    attrbuf;    /* private */
  26.     struct list_head    ops_list;    /* private */
  27.     struct list_head    family_list;    /* private */
  28. };
  29.  
  30. #define GENL_ADMIN_PERM        0x01
  31.  
  32. /**
  33.  * struct genl_info - receiving information
  34.  * @snd_seq: sending sequence number
  35.  * @snd_pid: netlink pid of sender
  36.  * @nlhdr: netlink message header
  37.  * @genlhdr: generic netlink message header
  38.  * @userhdr: user specific header
  39.  * @attrs: netlink attributes
  40.  */
  41. struct genl_info
  42. {
  43.     u32            snd_seq;
  44.     u32            snd_pid;
  45.     struct nlmsghdr *    nlhdr;
  46.     struct genlmsghdr *    genlhdr;
  47.     void *            userhdr;
  48.     struct nlattr **    attrs;
  49. };
  50.  
  51. /**
  52.  * struct genl_ops - generic netlink operations
  53.  * @cmd: command identifier
  54.  * @flags: flags
  55.  * @policy: attribute validation policy
  56.  * @doit: standard command callback
  57.  * @dumpit: callback for dumpers
  58.  * @ops_list: operations list
  59.  */
  60. struct genl_ops
  61. {
  62.     u8            cmd;
  63.     unsigned int        flags;
  64.     struct nla_policy    *policy;
  65.     int               (*doit)(struct sk_buff *skb,
  66.                        struct genl_info *info);
  67.     int               (*dumpit)(struct sk_buff *skb,
  68.                      struct netlink_callback *cb);
  69.     struct list_head    ops_list;
  70. };
  71.  
  72. extern int genl_register_family(struct genl_family *family);
  73. extern int genl_unregister_family(struct genl_family *family);
  74. extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
  75. extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
  76.  
  77. extern struct sock *genl_sock;
  78.  
  79. /**
  80.  * genlmsg_put - Add generic netlink header to netlink message
  81.  * @skb: socket buffer holding the message
  82.  * @pid: netlink pid the message is addressed to
  83.  * @seq: sequence number (usually the one of the sender)
  84.  * @type: netlink message type
  85.  * @hdrlen: length of the user specific header
  86.  * @flags netlink message flags
  87.  * @cmd: generic netlink command
  88.  * @version: version
  89.  *
  90.  * Returns pointer to user specific header
  91.  */
  92. static inline void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
  93.                 int type, int hdrlen, int flags,
  94.                 u8 cmd, u8 version)
  95. {
  96.     struct nlmsghdr *nlh;
  97.     struct genlmsghdr *hdr;
  98.  
  99.     nlh = nlmsg_put(skb, pid, seq, type, GENL_HDRLEN + hdrlen, flags);
  100.     if (nlh == NULL)
  101.         return NULL;
  102.  
  103.     hdr = nlmsg_data(nlh);
  104.     hdr->cmd = cmd;
  105.     hdr->version = version;
  106.     hdr->reserved = 0;
  107.  
  108.     return (char *) hdr + GENL_HDRLEN;
  109. }
  110.  
  111. /**
  112.  * genlmsg_end - Finalize a generic netlink message
  113.  * @skb: socket buffer the message is stored in
  114.  * @hdr: user specific header
  115.  */
  116. static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
  117. {
  118.     return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
  119. }
  120.  
  121. /**
  122.  * genlmsg_cancel - Cancel construction of a generic netlink message
  123.  * @skb: socket buffer the message is stored in
  124.  * @hdr: generic netlink message header
  125.  */
  126. static inline int genlmsg_cancel(struct sk_buff *skb, void *hdr)
  127. {
  128.     return nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
  129. }
  130.  
  131. /**
  132.  * genlmsg_multicast - multicast a netlink message
  133.  * @skb: netlink message as socket buffer
  134.  * @pid: own netlink pid to avoid sending to yourself
  135.  * @group: multicast group id
  136.  */
  137. static inline int genlmsg_multicast(struct sk_buff *skb, u32 pid,
  138.                     unsigned int group)
  139. {
  140.     return nlmsg_multicast(genl_sock, skb, pid, group);
  141. }
  142.  
  143. /**
  144.  * genlmsg_unicast - unicast a netlink message
  145.  * @skb: netlink message as socket buffer
  146.  * @pid: netlink pid of the destination socket
  147.  */
  148. static inline int genlmsg_unicast(struct sk_buff *skb, u32 pid)
  149. {
  150.     return nlmsg_unicast(genl_sock, skb, pid);
  151. }
  152.  
  153. #endif    /* __NET_GENERIC_NETLINK_H */
  154.