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 */ 18 struct 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 25 struct genl_ops; 26 struct 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 */ 46 struct 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 */ 78 struct 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 91 static inline struct net *genl_info_net(struct genl_info *info) 92 { 93 return read_pnet(&info->_net); 94 } 95 96 static 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 */ 112 struct 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 125 extern int __genl_register_family(struct genl_family *family); 126 127 static inline int genl_register_family(struct genl_family *family) 128 { 129 family->module = THIS_MODULE; 130 return __genl_register_family(family); 131 } 132 133 extern int __genl_register_family_with_ops(struct genl_family *family, 134 struct genl_ops *ops, size_t n_ops); 135 136 static 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 143 extern int genl_unregister_family(struct genl_family *family); 144 extern int genl_register_ops(struct genl_family *, struct genl_ops *ops); 145 extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops); 146 extern int genl_register_mc_group(struct genl_family *family, 147 struct genl_multicast_group *grp); 148 extern void genl_unregister_mc_group(struct genl_family *family, 149 struct genl_multicast_group *grp); 150 extern void genl_notify(struct sk_buff *skb, struct net *net, u32 portid, 151 u32 group, struct nlmsghdr *nlh, gfp_t flags); 152 153 void *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 */ 163 static 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 */ 181 static 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 */ 198 static 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 */ 212 static 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 */ 222 static 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 */ 236 static 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 */ 249 static 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 */ 264 int 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 */ 272 static 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 */ 282 static 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 */ 291 static 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 */ 300 static 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 */ 311 static 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 */ 320 static 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 */ 330 static 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