aboutsummaryrefslogtreecommitdiff
path: root/datapath/linux-2.6/compat-2.6/include/net/genetlink.h
blob: 57a47316dc2264c6e3f4e17a1929d4b776ab4712 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef __NET_GENERIC_NETLINK_WRAPPER_H
#define __NET_GENERIC_NETLINK_WRAPPER_H 1


#include <linux/netlink.h>
#include_next <net/genetlink.h>

#include <linux/version.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)

#include <linux/genetlink.h>

/*----------------------------------------------------------------------------
 * In 2.6.23, registering of multicast groups was added.  Our compatability 
 * layer just supports registering a single group, since that's all we
 * need.
 */

/**
 * 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;
};

int genl_register_mc_group(struct genl_family *family,
		struct genl_multicast_group *grp);
#endif /* linux kernel < 2.6.23 */


#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
/**
 * 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));
}

#define genlmsg_multicast(s, p, g, f) \
		genlmsg_multicast_flags((s), (p), (g), (f))

static inline int genlmsg_multicast_flags(struct sk_buff *skb, u32 pid, 
		unsigned int group, gfp_t flags)
{
	int err;

	NETLINK_CB(skb).dst_group = group;

	err = netlink_broadcast(genl_sock, skb, pid, group, flags);
	if (err > 0)
		err = 0;

	return err;
}
#endif /* linux kernel < 2.6.19 */


#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)

#define genlmsg_put(skb, p, seq, fam, flg, c) \
	genlmsg_put((skb), (p), (seq), (fam)->id, (fam)->hdrsize, \
			(flg), (c), (fam)->version)

/**
 * 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);
}

/**
 * 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);
}

/**
 * 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);
}
#endif /* linux kernel < 2.6.20 */

#endif /* genetlink.h */