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