netlink.h 8.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
#ifndef __LINUX_NETLINK_H
#define __LINUX_NETLINK_H

#include <linux/socket.h> /* for sa_family_t */
#include <linux/types.h>

#define NETLINK_ROUTE		0	/* Routing/device hook				*/
8
#define NETLINK_UNUSED		1	/* Unused number				*/
L
Linus Torvalds 已提交
9 10
#define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/
#define NETLINK_FIREWALL	3	/* Firewalling hook				*/
11
#define NETLINK_INET_DIAG	4	/* INET socket monitoring			*/
L
Linus Torvalds 已提交
12 13 14
#define NETLINK_NFLOG		5	/* netfilter/iptables ULOG */
#define NETLINK_XFRM		6	/* ipsec */
#define NETLINK_SELINUX		7	/* SELinux event notifications */
15
#define NETLINK_ISCSI		8	/* Open-iSCSI */
L
Linus Torvalds 已提交
16
#define NETLINK_AUDIT		9	/* auditing */
17
#define NETLINK_FIB_LOOKUP	10	
E
Evgeniy Polyakov 已提交
18
#define NETLINK_CONNECTOR	11
19
#define NETLINK_NETFILTER	12	/* netfilter subsystem */
L
Linus Torvalds 已提交
20 21 22
#define NETLINK_IP6_FW		13
#define NETLINK_DNRTMSG		14	/* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT	15	/* Kernel messages to userspace */
23
#define NETLINK_GENERIC		16
24 25
/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT	18	/* SCSI Transports */
26
#define NETLINK_ECRYPTFS	19
R
Roland Dreier 已提交
27
#define NETLINK_RDMA		20
L
Linus Torvalds 已提交
28 29 30

#define MAX_LINKS 32		

E
Eric Dumazet 已提交
31
struct sockaddr_nl {
L
Linus Torvalds 已提交
32 33
	sa_family_t	nl_family;	/* AF_NETLINK	*/
	unsigned short	nl_pad;		/* zero		*/
34
	__u32		nl_pid;		/* port ID	*/
L
Linus Torvalds 已提交
35 36 37
       	__u32		nl_groups;	/* multicast groups mask */
};

E
Eric Dumazet 已提交
38
struct nlmsghdr {
L
Linus Torvalds 已提交
39 40 41 42
	__u32		nlmsg_len;	/* Length of message including header */
	__u16		nlmsg_type;	/* Message content */
	__u16		nlmsg_flags;	/* Additional flags */
	__u32		nlmsg_seq;	/* Sequence number */
43
	__u32		nlmsg_pid;	/* Sending process port ID */
L
Linus Torvalds 已提交
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
};

/* Flags values */

#define NLM_F_REQUEST		1	/* It is request message. 	*/
#define NLM_F_MULTI		2	/* Multipart message, terminated by NLMSG_DONE */
#define NLM_F_ACK		4	/* Reply with ack, with zero or error code */
#define NLM_F_ECHO		8	/* Echo this request 		*/

/* Modifiers to GET request */
#define NLM_F_ROOT	0x100	/* specify tree	root	*/
#define NLM_F_MATCH	0x200	/* return all matching	*/
#define NLM_F_ATOMIC	0x400	/* atomic GET		*/
#define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)

/* Modifiers to NEW request */
#define NLM_F_REPLACE	0x100	/* Override existing		*/
#define NLM_F_EXCL	0x200	/* Do not touch, if it exists	*/
#define NLM_F_CREATE	0x400	/* Create, if it does not exist	*/
#define NLM_F_APPEND	0x800	/* Add to end of list		*/

/*
   4.4BSD ADD		NLM_F_CREATE|NLM_F_EXCL
   4.4BSD CHANGE	NLM_F_REPLACE

   True CHANGE		NLM_F_CREATE|NLM_F_REPLACE
   Append		NLM_F_CREATE
   Check		NLM_F_EXCL
 */

74
#define NLMSG_ALIGNTO	4U
L
Linus Torvalds 已提交
75
#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
76 77
#define NLMSG_HDRLEN	 ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))
L
Linus Torvalds 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91
#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
#define NLMSG_NEXT(nlh,len)	 ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
				  (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
			   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
			   (nlh)->nlmsg_len <= (len))
#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))

#define NLMSG_NOOP		0x1	/* Nothing.		*/
#define NLMSG_ERROR		0x2	/* Error		*/
#define NLMSG_DONE		0x3	/* End of a dump	*/
#define NLMSG_OVERRUN		0x4	/* Data lost		*/

92 93
#define NLMSG_MIN_TYPE		0x10	/* < 0x10: reserved control messages */

E
Eric Dumazet 已提交
94
struct nlmsgerr {
L
Linus Torvalds 已提交
95 96 97 98
	int		error;
	struct nlmsghdr msg;
};

99 100 101
#define NETLINK_ADD_MEMBERSHIP	1
#define NETLINK_DROP_MEMBERSHIP	2
#define NETLINK_PKTINFO		3
102
#define NETLINK_BROADCAST_ERROR	4
103
#define NETLINK_NO_ENOBUFS	5
104

E
Eric Dumazet 已提交
105
struct nl_pktinfo {
106 107 108
	__u32	group;
};

L
Linus Torvalds 已提交
109 110 111 112 113 114 115
#define NET_MAJOR 36		/* Major 36 is reserved for networking 						*/

enum {
	NETLINK_UNCONNECTED = 0,
	NETLINK_CONNECTED,
};

116 117 118 119 120 121 122 123 124
/*
 *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
 * +---------------------+- - -+- - - - - - - - - -+- - -+
 * |        Header       | Pad |     Payload       | Pad |
 * |   (struct nlattr)   | ing |                   | ing |
 * +---------------------+- - -+- - - - - - - - - -+- - -+
 *  <-------------- nlattr->nla_len -------------->
 */

E
Eric Dumazet 已提交
125
struct nlattr {
126 127 128 129
	__u16           nla_len;
	__u16           nla_type;
};

130 131 132 133 134 135 136 137 138 139 140 141 142 143
/*
 * nla_type (16 bits)
 * +---+---+-------------------------------+
 * | N | O | Attribute Type                |
 * +---+---+-------------------------------+
 * N := Carries nested attributes
 * O := Payload stored in network byte order
 *
 * Note: The N and O flag are mutually exclusive.
 */
#define NLA_F_NESTED		(1 << 15)
#define NLA_F_NET_BYTEORDER	(1 << 14)
#define NLA_TYPE_MASK		~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)

144 145 146 147
#define NLA_ALIGNTO		4
#define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
#define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))

L
Linus Torvalds 已提交
148 149 150 151 152
#ifdef __KERNEL__

#include <linux/capability.h>
#include <linux/skbuff.h>

153 154
struct net;

155 156 157 158 159
static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb)
{
	return (struct nlmsghdr *)skb->data;
}

E
Eric Dumazet 已提交
160
struct netlink_skb_parms {
L
Linus Torvalds 已提交
161 162
	struct ucred		creds;		/* Skb credentials	*/
	__u32			pid;
163
	__u32			dst_group;
L
Linus Torvalds 已提交
164 165 166 167 168 169
};

#define NETLINK_CB(skb)		(*(struct netlink_skb_parms*)&((skb)->cb))
#define NETLINK_CREDS(skb)	(&NETLINK_CB((skb)).creds)


170 171 172
extern void netlink_table_grab(void);
extern void netlink_table_ungrab(void);

173 174
extern struct sock *netlink_kernel_create(struct net *net,
					  int unit,unsigned int groups,
175
					  void (*input)(struct sk_buff *skb),
176 177
					  struct mutex *cb_mutex,
					  struct module *module);
178
extern void netlink_kernel_release(struct sock *sk);
179
extern int __netlink_change_ngroups(struct sock *sk, unsigned int groups);
180
extern int netlink_change_ngroups(struct sock *sk, unsigned int groups);
181
extern void __netlink_clear_multicast_users(struct sock *sk, unsigned int group);
182
extern void netlink_clear_multicast_users(struct sock *sk, unsigned int group);
L
Linus Torvalds 已提交
183
extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);
184
extern int netlink_has_listeners(struct sock *sk, unsigned int group);
L
Linus Torvalds 已提交
185 186
extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);
extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,
A
Al Viro 已提交
187
			     __u32 group, gfp_t allocation);
188 189 190 191
extern int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb,
	__u32 pid, __u32 group, gfp_t allocation,
	int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data),
	void *filter_data);
192
extern int netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code);
L
Linus Torvalds 已提交
193 194 195 196 197
extern int netlink_register_notifier(struct notifier_block *nb);
extern int netlink_unregister_notifier(struct notifier_block *nb);

/* finegrained unicast helpers: */
struct sock *netlink_getsockbyfilp(struct file *filp);
198
int netlink_attachskb(struct sock *sk, struct sk_buff *skb,
P
Patrick McHardy 已提交
199
		      long *timeo, struct sock *ssk);
L
Linus Torvalds 已提交
200
void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
201
int netlink_sendskb(struct sock *sk, struct sk_buff *skb);
L
Linus Torvalds 已提交
202 203 204

/*
 *	skb should fit one page. This choice is good for headerless malloc.
205 206 207
 *	But we should limit to 8K so that userspace does not have to
 *	use enormous buffer sizes on recvmsg() calls just to avoid
 *	MSG_TRUNC when PAGE_SIZE is very large.
L
Linus Torvalds 已提交
208
 */
209 210 211 212 213 214
#if PAGE_SIZE < 8192UL
#define NLMSG_GOODSIZE	SKB_WITH_OVERHEAD(PAGE_SIZE)
#else
#define NLMSG_GOODSIZE	SKB_WITH_OVERHEAD(8192UL)
#endif

215
#define NLMSG_DEFAULT_SIZE (NLMSG_GOODSIZE - NLMSG_HDRLEN)
L
Linus Torvalds 已提交
216 217


E
Eric Dumazet 已提交
218
struct netlink_callback {
219 220 221 222 223 224 225
	struct sk_buff		*skb;
	const struct nlmsghdr	*nlh;
	int			(*dump)(struct sk_buff * skb,
					struct netlink_callback *cb);
	int			(*done)(struct netlink_callback *cb);
	int			family;
	long			args[6];
L
Linus Torvalds 已提交
226 227
};

E
Eric Dumazet 已提交
228
struct netlink_notify {
229
	struct net *net;
L
Linus Torvalds 已提交
230 231 232 233 234
	int pid;
	int protocol;
};

static __inline__ struct nlmsghdr *
235
__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
L
Linus Torvalds 已提交
236 237 238 239 240 241 242
{
	struct nlmsghdr *nlh;
	int size = NLMSG_LENGTH(len);

	nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
	nlh->nlmsg_type = type;
	nlh->nlmsg_len = size;
243
	nlh->nlmsg_flags = flags;
L
Linus Torvalds 已提交
244 245
	nlh->nlmsg_pid = pid;
	nlh->nlmsg_seq = seq;
246 247
	if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0)
		memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
L
Linus Torvalds 已提交
248 249 250
	return nlh;
}

251
#define NLMSG_NEW(skb, pid, seq, type, len, flags) \
252
({	if (unlikely(skb_tailroom(skb) < (int)NLMSG_SPACE(len))) \
253
		goto nlmsg_failure; \
254 255 256 257
	__nlmsg_put(skb, pid, seq, type, len, flags); })

#define NLMSG_PUT(skb, pid, seq, type, len) \
	NLMSG_NEW(skb, pid, seq, type, len, 0)
258

L
Linus Torvalds 已提交
259
extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
260
			      const struct nlmsghdr *nlh,
L
Linus Torvalds 已提交
261 262 263 264 265 266 267 268 269 270 271
			      int (*dump)(struct sk_buff *skb, struct netlink_callback*),
			      int (*done)(struct netlink_callback*));


#define NL_NONROOT_RECV 0x1
#define NL_NONROOT_SEND 0x2
extern void netlink_set_nonroot(int protocol, unsigned flag);

#endif /* __KERNEL__ */

#endif	/* __LINUX_NETLINK_H */