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