2005-11-10 04:25:56 +03:00
# ifndef __NET_GENERIC_NETLINK_H
# define __NET_GENERIC_NETLINK_H
# include <linux/genetlink.h>
# include <net/netlink.h>
2007-07-19 02:47:52 +04:00
/**
* struct genl_multicast_group - generic netlink multicast group
* @ name : name of the multicast group , names are per - family
* @ id : multicast group ID , assigned by the core , to use with
* genlmsg_multicast ( ) .
* @ list : list entry for linking
* @ family : pointer to family , need not be set before registering
*/
struct genl_multicast_group
{
struct genl_family * family ; /* private */
struct list_head list ; /* private */
char name [ GENL_NAMSIZ ] ;
u32 id ;
} ;
2005-11-10 04:25:56 +03:00
/**
* struct genl_family - generic netlink family
* @ id : protocol family idenfitier
* @ hdrsize : length of user specific header in bytes
* @ name : name of family
* @ version : protocol version
* @ maxattr : maximum number of attributes supported
* @ attrbuf : buffer to store parsed attributes
* @ ops_list : list of all assigned operations
* @ family_list : family list
2007-07-19 02:47:52 +04:00
* @ mcast_groups : multicast groups list
2005-11-10 04:25:56 +03:00
*/
struct genl_family
{
unsigned int id ;
unsigned int hdrsize ;
char name [ GENL_NAMSIZ ] ;
unsigned int version ;
unsigned int maxattr ;
struct nlattr * * attrbuf ; /* private */
struct list_head ops_list ; /* private */
struct list_head family_list ; /* private */
2007-07-19 02:47:52 +04:00
struct list_head mcast_groups ; /* private */
2005-11-10 04:25:56 +03:00
} ;
/**
* struct genl_info - receiving information
* @ snd_seq : sending sequence number
* @ snd_pid : netlink pid of sender
* @ nlhdr : netlink message header
* @ genlhdr : generic netlink message header
* @ userhdr : user specific header
* @ attrs : netlink attributes
*/
struct genl_info
{
u32 snd_seq ;
u32 snd_pid ;
struct nlmsghdr * nlhdr ;
struct genlmsghdr * genlhdr ;
void * userhdr ;
struct nlattr * * attrs ;
} ;
/**
* struct genl_ops - generic netlink operations
* @ cmd : command identifier
* @ flags : flags
* @ policy : attribute validation policy
* @ doit : standard command callback
* @ dumpit : callback for dumpers
2006-12-02 07:07:42 +03:00
* @ done : completion callback for dumps
2005-11-10 04:25:56 +03:00
* @ ops_list : operations list
*/
struct genl_ops
{
2006-01-04 01:13:29 +03:00
u8 cmd ;
2005-11-10 04:25:56 +03:00
unsigned int flags ;
2007-06-05 23:38:30 +04:00
const struct nla_policy * policy ;
2005-11-10 04:25:56 +03:00
int ( * doit ) ( struct sk_buff * skb ,
struct genl_info * info ) ;
int ( * dumpit ) ( struct sk_buff * skb ,
struct netlink_callback * cb ) ;
2006-12-02 07:07:42 +03:00
int ( * done ) ( struct netlink_callback * cb ) ;
2005-11-10 04:25:56 +03:00
struct list_head ops_list ;
} ;
extern int genl_register_family ( struct genl_family * family ) ;
extern int genl_unregister_family ( struct genl_family * family ) ;
extern int genl_register_ops ( struct genl_family * , struct genl_ops * ops ) ;
extern int genl_unregister_ops ( struct genl_family * , struct genl_ops * ops ) ;
2007-07-19 02:47:52 +04:00
extern int genl_register_mc_group ( struct genl_family * family ,
struct genl_multicast_group * grp ) ;
extern void genl_unregister_mc_group ( struct genl_family * family ,
struct genl_multicast_group * grp ) ;
2005-11-10 04:25:56 +03:00
extern struct sock * genl_sock ;
/**
* genlmsg_put - Add generic netlink header to netlink message
* @ skb : socket buffer holding the message
* @ pid : netlink pid the message is addressed to
* @ seq : sequence number ( usually the one of the sender )
2006-11-15 06:46:02 +03:00
* @ family : generic netlink family
2005-11-10 04:25:56 +03:00
* @ flags netlink message flags
* @ cmd : generic netlink command
*
* Returns pointer to user specific header
*/
static inline void * genlmsg_put ( struct sk_buff * skb , u32 pid , u32 seq ,
2006-11-15 06:46:02 +03:00
struct genl_family * family , int flags , u8 cmd )
2005-11-10 04:25:56 +03:00
{
struct nlmsghdr * nlh ;
struct genlmsghdr * hdr ;
2006-11-15 06:46:02 +03:00
nlh = nlmsg_put ( skb , pid , seq , family - > id , GENL_HDRLEN +
family - > hdrsize , flags ) ;
2005-11-10 04:25:56 +03:00
if ( nlh = = NULL )
return NULL ;
hdr = nlmsg_data ( nlh ) ;
hdr - > cmd = cmd ;
2006-11-15 06:46:02 +03:00
hdr - > version = family - > version ;
2005-11-10 04:25:56 +03:00
hdr - > reserved = 0 ;
return ( char * ) hdr + GENL_HDRLEN ;
}
2006-11-15 06:46:02 +03:00
/**
* genlmsg_put_reply - Add generic netlink header to a reply message
* @ skb : socket buffer holding the message
* @ info : receiver info
* @ family : generic netlink family
* @ flags : netlink message flags
* @ cmd : generic netlink command
*
* Returns pointer to user specific header
*/
static inline void * genlmsg_put_reply ( struct sk_buff * skb ,
struct genl_info * info ,
struct genl_family * family ,
int flags , u8 cmd )
{
return genlmsg_put ( skb , info - > snd_pid , info - > snd_seq , family ,
flags , cmd ) ;
}
2005-11-10 04:25:56 +03:00
/**
* genlmsg_end - Finalize a generic netlink message
* @ skb : socket buffer the message is stored in
* @ hdr : user specific header
*/
static inline int genlmsg_end ( struct sk_buff * skb , void * hdr )
{
return nlmsg_end ( skb , hdr - GENL_HDRLEN - NLMSG_HDRLEN ) ;
}
/**
* genlmsg_cancel - Cancel construction of a generic netlink message
* @ skb : socket buffer the message is stored in
* @ hdr : generic netlink message header
*/
static inline int genlmsg_cancel ( struct sk_buff * skb , void * hdr )
{
return nlmsg_cancel ( skb , hdr - GENL_HDRLEN - NLMSG_HDRLEN ) ;
}
/**
* genlmsg_multicast - multicast a netlink message
* @ skb : netlink message as socket buffer
* @ pid : own netlink pid to avoid sending to yourself
* @ group : multicast group id
2006-08-15 11:31:06 +04:00
* @ flags : allocation flags
2005-11-10 04:25:56 +03:00
*/
static inline int genlmsg_multicast ( struct sk_buff * skb , u32 pid ,
2006-08-15 11:31:06 +04:00
unsigned int group , gfp_t flags )
2005-11-10 04:25:56 +03:00
{
2006-08-15 11:31:06 +04:00
return nlmsg_multicast ( genl_sock , skb , pid , group , flags ) ;
2005-11-10 04:25:56 +03:00
}
/**
* genlmsg_unicast - unicast a netlink message
* @ skb : netlink message as socket buffer
* @ pid : netlink pid of the destination socket
*/
static inline int genlmsg_unicast ( struct sk_buff * skb , u32 pid )
{
return nlmsg_unicast ( genl_sock , skb , pid ) ;
}
2006-11-15 06:45:27 +03:00
/**
* genlmsg_reply - reply to a request
* @ skb : netlink message to be sent back
* @ info : receiver information
*/
static inline int genlmsg_reply ( struct sk_buff * skb , struct genl_info * info )
{
return genlmsg_unicast ( skb , info - > snd_pid ) ;
}
2006-07-14 11:24:39 +04:00
/**
* gennlmsg_data - head of message payload
* @ gnlh : genetlink messsage header
*/
static inline void * genlmsg_data ( const struct genlmsghdr * gnlh )
{
return ( ( unsigned char * ) gnlh + GENL_HDRLEN ) ;
}
/**
* genlmsg_len - length of message payload
* @ gnlh : genetlink message header
*/
static inline int genlmsg_len ( const struct genlmsghdr * gnlh )
{
struct nlmsghdr * nlh = ( struct nlmsghdr * ) ( ( unsigned char * ) gnlh -
NLMSG_HDRLEN ) ;
return ( nlh - > nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN ) ;
}
2006-10-01 10:28:51 +04:00
/**
* genlmsg_msg_size - length of genetlink message not including padding
* @ payload : length of message payload
*/
static inline int genlmsg_msg_size ( int payload )
{
return GENL_HDRLEN + payload ;
}
/**
* genlmsg_total_size - length of genetlink message including padding
* @ payload : length of message payload
*/
static inline int genlmsg_total_size ( int payload )
{
return NLMSG_ALIGN ( genlmsg_msg_size ( payload ) ) ;
}
2006-11-15 06:44:52 +03:00
/**
* genlmsg_new - Allocate a new generic netlink message
* @ payload : size of the message payload
* @ flags : the type of memory to allocate .
*/
static inline struct sk_buff * genlmsg_new ( size_t payload , gfp_t flags )
{
return nlmsg_new ( genlmsg_total_size ( payload ) , flags ) ;
}
2005-11-10 04:25:56 +03:00
# endif /* __NET_GENERIC_NETLINK_H */