Blame view

include/linux/rtnetlink.h 20.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef __LINUX_RTNETLINK_H
  #define __LINUX_RTNETLINK_H
541c94f1d   Jaswinder Singh Rajput   headers_check fix...
3
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
  #include <linux/netlink.h>
cbde1668e   YOSHIFUJI Hideaki   [NET]: Move netli...
5
  #include <linux/if_link.h>
e07bca84c   Thomas Graf   [NETLINK]: Restor...
6
7
  #include <linux/if_addr.h>
  #include <linux/neighbour.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8

25239cee7   Patrick McHardy   net: rtnetlink: d...
9
10
11
12
  /* rtnetlink families. Values up to 127 are reserved for real address
   * families, values above 128 may be used arbitrarily.
   */
  #define RTNL_FAMILY_IPMR		128
d1db275dd   Patrick McHardy   ipv6: ip6mr: supp...
13
14
  #define RTNL_FAMILY_IP6MR		129
  #define RTNL_FAMILY_MAX			129
25239cee7   Patrick McHardy   net: rtnetlink: d...
15

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  /****
   *		Routing/neighbour discovery messages.
   ****/
  
  /* Types of messages */
  
  enum {
  	RTM_BASE	= 16,
  #define RTM_BASE	RTM_BASE
  
  	RTM_NEWLINK	= 16,
  #define RTM_NEWLINK	RTM_NEWLINK
  	RTM_DELLINK,
  #define RTM_DELLINK	RTM_DELLINK
  	RTM_GETLINK,
  #define RTM_GETLINK	RTM_GETLINK
  	RTM_SETLINK,
  #define RTM_SETLINK	RTM_SETLINK
  
  	RTM_NEWADDR	= 20,
  #define RTM_NEWADDR	RTM_NEWADDR
  	RTM_DELADDR,
  #define RTM_DELADDR	RTM_DELADDR
  	RTM_GETADDR,
  #define RTM_GETADDR	RTM_GETADDR
  
  	RTM_NEWROUTE	= 24,
  #define RTM_NEWROUTE	RTM_NEWROUTE
  	RTM_DELROUTE,
  #define RTM_DELROUTE	RTM_DELROUTE
  	RTM_GETROUTE,
  #define RTM_GETROUTE	RTM_GETROUTE
  
  	RTM_NEWNEIGH	= 28,
  #define RTM_NEWNEIGH	RTM_NEWNEIGH
  	RTM_DELNEIGH,
  #define RTM_DELNEIGH	RTM_DELNEIGH
  	RTM_GETNEIGH,
  #define RTM_GETNEIGH	RTM_GETNEIGH
  
  	RTM_NEWRULE	= 32,
  #define RTM_NEWRULE	RTM_NEWRULE
  	RTM_DELRULE,
  #define RTM_DELRULE	RTM_DELRULE
  	RTM_GETRULE,
  #define RTM_GETRULE	RTM_GETRULE
  
  	RTM_NEWQDISC	= 36,
  #define RTM_NEWQDISC	RTM_NEWQDISC
  	RTM_DELQDISC,
  #define RTM_DELQDISC	RTM_DELQDISC
  	RTM_GETQDISC,
  #define RTM_GETQDISC	RTM_GETQDISC
  
  	RTM_NEWTCLASS	= 40,
  #define RTM_NEWTCLASS	RTM_NEWTCLASS
  	RTM_DELTCLASS,
  #define RTM_DELTCLASS	RTM_DELTCLASS
  	RTM_GETTCLASS,
  #define RTM_GETTCLASS	RTM_GETTCLASS
  
  	RTM_NEWTFILTER	= 44,
  #define RTM_NEWTFILTER	RTM_NEWTFILTER
  	RTM_DELTFILTER,
  #define RTM_DELTFILTER	RTM_DELTFILTER
  	RTM_GETTFILTER,
  #define RTM_GETTFILTER	RTM_GETTFILTER
  
  	RTM_NEWACTION	= 48,
  #define RTM_NEWACTION   RTM_NEWACTION
  	RTM_DELACTION,
  #define RTM_DELACTION   RTM_DELACTION
  	RTM_GETACTION,
  #define RTM_GETACTION   RTM_GETACTION
  
  	RTM_NEWPREFIX	= 52,
  #define RTM_NEWPREFIX	RTM_NEWPREFIX
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
97
98
  
  	RTM_GETMULTICAST = 58,
  #define RTM_GETMULTICAST RTM_GETMULTICAST
  
  	RTM_GETANYCAST	= 62,
  #define RTM_GETANYCAST	RTM_GETANYCAST
c7fb64db0   Thomas Graf   [NETLINK]: Neighb...
99
100
101
102
103
104
  	RTM_NEWNEIGHTBL	= 64,
  #define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
  	RTM_GETNEIGHTBL	= 66,
  #define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
  	RTM_SETNEIGHTBL,
  #define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
31910575a   Pierre Ynard   [IPv6]: Export us...
105
106
  	RTM_NEWNDUSEROPT = 68,
  #define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
2a8cc6c89   YOSHIFUJI Hideaki   [IPV6] ADDRCONF: ...
107
108
109
  	RTM_NEWADDRLABEL = 72,
  #define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
  	RTM_DELADDRLABEL,
5d5d9c97f   Tushar Gohad   IPv6/addrconf: Fi...
110
  #define RTM_DELADDRLABEL RTM_DELADDRLABEL
2a8cc6c89   YOSHIFUJI Hideaki   [IPV6] ADDRCONF: ...
111
112
  	RTM_GETADDRLABEL,
  #define RTM_GETADDRLABEL RTM_GETADDRLABEL
2f90b8657   Alexander Duyck   ixgbe: this patch...
113
114
115
116
  	RTM_GETDCB = 78,
  #define RTM_GETDCB RTM_GETDCB
  	RTM_SETDCB,
  #define RTM_SETDCB RTM_SETDCB
d775fc09f   Thomas Graf   [RTNETLINK] Fix R...
117
118
  	__RTM_MAX,
  #define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  };
db46edc6d   Thomas Graf   [RTNETLINK] Clean...
120
121
  #define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
  #define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
f90a0a74b   Thomas Graf   [RTNETLINK] Fix &...
122
  #define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
  /* 
     Generic structure for encapsulation of optional route information.
     It is reminiscent of sockaddr, but with sa_family replaced
     with attribute type.
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
128
  struct rtattr {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  	unsigned short	rta_len;
  	unsigned short	rta_type;
  };
  
  /* Macros to handle rtattributes */
  
  #define RTA_ALIGNTO	4
  #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
  #define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
  			 (rta)->rta_len >= sizeof(struct rtattr) && \
  			 (rta)->rta_len <= (len))
  #define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
  				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
  #define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
  #define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
  #define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
  #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
  
  
  
  
  /******************************************************************************
   *		Definitions used in routing table administration.
   ****/
d94d9fee9   Eric Dumazet   net: cleanup incl...
153
  struct rtmsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
157
158
159
160
161
162
163
164
165
166
167
  	unsigned char		rtm_family;
  	unsigned char		rtm_dst_len;
  	unsigned char		rtm_src_len;
  	unsigned char		rtm_tos;
  
  	unsigned char		rtm_table;	/* Routing table id */
  	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
  	unsigned char		rtm_scope;	/* See below */	
  	unsigned char		rtm_type;	/* See below	*/
  
  	unsigned		rtm_flags;
  };
  
  /* rtm_type */
d94d9fee9   Eric Dumazet   net: cleanup incl...
168
  enum {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  	RTN_UNSPEC,
  	RTN_UNICAST,		/* Gateway or direct route	*/
  	RTN_LOCAL,		/* Accept locally		*/
  	RTN_BROADCAST,		/* Accept locally as broadcast,
  				   send as broadcast */
  	RTN_ANYCAST,		/* Accept locally as broadcast,
  				   but send as unicast */
  	RTN_MULTICAST,		/* Multicast route		*/
  	RTN_BLACKHOLE,		/* Drop				*/
  	RTN_UNREACHABLE,	/* Destination is unreachable   */
  	RTN_PROHIBIT,		/* Administratively prohibited	*/
  	RTN_THROW,		/* Not in this table		*/
  	RTN_NAT,		/* Translate this address	*/
  	RTN_XRESOLVE,		/* Use external resolver	*/
  	__RTN_MAX
  };
  
  #define RTN_MAX (__RTN_MAX - 1)
  
  
  /* rtm_protocol */
  
  #define RTPROT_UNSPEC	0
  #define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
  				   not used by current IPv4 */
  #define RTPROT_KERNEL	2	/* Route installed by kernel		*/
  #define RTPROT_BOOT	3	/* Route installed during boot		*/
  #define RTPROT_STATIC	4	/* Route installed by administrator	*/
  
  /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
     they are just passed from user and back as is.
     It will be used by hypothetical multiple routing daemons.
     Note that protocol values should be standardized in order to
     avoid conflicts.
   */
  
  #define RTPROT_GATED	8	/* Apparently, GateD */
  #define RTPROT_RA	9	/* RDISC/ND router advertisements */
  #define RTPROT_MRT	10	/* Merit MRT */
  #define RTPROT_ZEBRA	11	/* Zebra */
  #define RTPROT_BIRD	12	/* BIRD */
  #define RTPROT_DNROUTED	13	/* DECnet routing daemon */
  #define RTPROT_XORP	14	/* XORP */
99cae7fca   Alpt   [NET] rtnetlink: ...
212
  #define RTPROT_NTK	15	/* Netsukuku */
2e1ab634b   Stephen Hemminger   rtnetlink: add ne...
213
  #define RTPROT_DHCP	16      /* DHCP client */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
215
216
217
218
219
220
221
222
223
224
  
  /* rtm_scope
  
     Really it is not scope, but sort of distance to the destination.
     NOWHERE are reserved for not existing destinations, HOST is our
     local addresses, LINK are destinations, located on directly attached
     link and UNIVERSE is everywhere in the Universe.
  
     Intermediate values are also possible f.e. interior routes
     could be assigned a value between UNIVERSE and LINK.
  */
d94d9fee9   Eric Dumazet   net: cleanup incl...
225
  enum rt_scope_t {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
  	RT_SCOPE_UNIVERSE=0,
  /* User defined values  */
  	RT_SCOPE_SITE=200,
  	RT_SCOPE_LINK=253,
  	RT_SCOPE_HOST=254,
  	RT_SCOPE_NOWHERE=255
  };
  
  /* rtm_flags */
  
  #define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
  #define RTM_F_CLONED		0x200	/* This route is cloned		*/
  #define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
  #define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
  
  /* Reserved table identifiers */
d94d9fee9   Eric Dumazet   net: cleanup incl...
242
  enum rt_class_t {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
244
  	RT_TABLE_UNSPEC=0,
  /* User defined values */
709772e6e   Krzysztof Piotr Oledzki   net: Fix routing ...
245
  	RT_TABLE_COMPAT=252,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
  	RT_TABLE_DEFAULT=253,
  	RT_TABLE_MAIN=254,
  	RT_TABLE_LOCAL=255,
b801f5491   Patrick McHardy   [NET]: Increate R...
249
  	RT_TABLE_MAX=0xFFFFFFFF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
  
  
  /* Routing message attributes */
d94d9fee9   Eric Dumazet   net: cleanup incl...
254
  enum rtattr_type_t {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
258
259
260
261
262
263
264
  	RTA_UNSPEC,
  	RTA_DST,
  	RTA_SRC,
  	RTA_IIF,
  	RTA_OIF,
  	RTA_GATEWAY,
  	RTA_PRIORITY,
  	RTA_PREFSRC,
  	RTA_METRICS,
  	RTA_MULTIPATH,
1f9d11c7c   Thomas Graf   route: Mark unuse...
265
  	RTA_PROTOINFO, /* no longer used */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
267
  	RTA_FLOW,
  	RTA_CACHEINFO,
1f9d11c7c   Thomas Graf   route: Mark unuse...
268
  	RTA_SESSION, /* no longer used */
e06e7c615   David S. Miller   [IPV4]: The sched...
269
  	RTA_MP_ALGO, /* no longer used */
9e762a4a8   Patrick McHardy   [NET]: Introduce ...
270
  	RTA_TABLE,
963bfeeee   Eric Dumazet   net: RTA_MARK add...
271
  	RTA_MARK,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
  	__RTA_MAX
  };
  
  #define RTA_MAX (__RTA_MAX - 1)
  
  #define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
  #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
  
  /* RTM_MULTIPATH --- array of struct rtnexthop.
   *
   * "struct rtnexthop" describes all necessary nexthop information,
   * i.e. parameters of path to a destination via this nexthop.
   *
   * At the moment it is impossible to set different prefsrc, mtu, window
   * and rtt for different paths from multipath.
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
288
  struct rtnexthop {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
  	unsigned short		rtnh_len;
  	unsigned char		rtnh_flags;
  	unsigned char		rtnh_hops;
  	int			rtnh_ifindex;
  };
  
  /* rtnh_flags */
  
  #define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
  #define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
  #define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
  
  /* Macros to handle hexthops */
  
  #define RTNH_ALIGNTO	4
  #define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
  #define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
  			   ((int)(rtnh)->rtnh_len) <= (len))
  #define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
  #define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
  #define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
  #define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
  
  /* RTM_CACHEINFO */
d94d9fee9   Eric Dumazet   net: cleanup incl...
313
  struct rta_cacheinfo {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
315
316
317
318
319
320
321
322
323
324
325
326
  	__u32	rta_clntref;
  	__u32	rta_lastuse;
  	__s32	rta_expires;
  	__u32	rta_error;
  	__u32	rta_used;
  
  #define RTNETLINK_HAVE_PEERINFO 1
  	__u32	rta_id;
  	__u32	rta_ts;
  	__u32	rta_tsage;
  };
  
  /* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
d94d9fee9   Eric Dumazet   net: cleanup incl...
327
  enum {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
  	RTAX_UNSPEC,
  #define RTAX_UNSPEC RTAX_UNSPEC
  	RTAX_LOCK,
  #define RTAX_LOCK RTAX_LOCK
  	RTAX_MTU,
  #define RTAX_MTU RTAX_MTU
  	RTAX_WINDOW,
  #define RTAX_WINDOW RTAX_WINDOW
  	RTAX_RTT,
  #define RTAX_RTT RTAX_RTT
  	RTAX_RTTVAR,
  #define RTAX_RTTVAR RTAX_RTTVAR
  	RTAX_SSTHRESH,
  #define RTAX_SSTHRESH RTAX_SSTHRESH
  	RTAX_CWND,
  #define RTAX_CWND RTAX_CWND
  	RTAX_ADVMSS,
  #define RTAX_ADVMSS RTAX_ADVMSS
  	RTAX_REORDERING,
  #define RTAX_REORDERING RTAX_REORDERING
  	RTAX_HOPLIMIT,
  #define RTAX_HOPLIMIT RTAX_HOPLIMIT
  	RTAX_INITCWND,
  #define RTAX_INITCWND RTAX_INITCWND
  	RTAX_FEATURES,
  #define RTAX_FEATURES RTAX_FEATURES
05bb1fad1   David S. Miller   [TCP]: Allow mini...
354
355
  	RTAX_RTO_MIN,
  #define RTAX_RTO_MIN RTAX_RTO_MIN
31d12926e   laurent chavey   net: Add rtnetlin...
356
357
  	RTAX_INITRWND,
  #define RTAX_INITRWND RTAX_INITRWND
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
361
362
363
  	__RTAX_MAX
  };
  
  #define RTAX_MAX (__RTAX_MAX - 1)
  
  #define RTAX_FEATURE_ECN	0x00000001
bb5b7c112   David S. Miller   tcp: Revert per-r...
364
365
  #define RTAX_FEATURE_SACK	0x00000002
  #define RTAX_FEATURE_TIMESTAMP	0x00000004
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
  #define RTAX_FEATURE_ALLFRAG	0x00000008
d94d9fee9   Eric Dumazet   net: cleanup incl...
367
  struct rta_session {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  	__u8	proto;
8a47077a0   Patrick McHardy   [NETLINK]: Missin...
369
370
  	__u8	pad1;
  	__u16	pad2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
  
  	union {
  		struct {
  			__u16	sport;
  			__u16	dport;
  		} ports;
  
  		struct {
  			__u8	type;
  			__u8	code;
  			__u16	ident;
  		} icmpt;
  
  		__u32		spi;
  	} u;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
387
388
389
  /****
   *		General form of address family dependent message.
   ****/
d94d9fee9   Eric Dumazet   net: cleanup incl...
390
  struct rtgenmsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
394
395
396
397
398
399
400
401
  	unsigned char		rtgen_family;
  };
  
  /*****************************************************************
   *		Link layer specific messages.
   ****/
  
  /* struct ifinfomsg
   * passes link level specific information, not dependent
   * on network protocol.
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
402
  struct ifinfomsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
404
405
406
407
408
409
410
411
412
413
  	unsigned char	ifi_family;
  	unsigned char	__ifi_pad;
  	unsigned short	ifi_type;		/* ARPHRD_* */
  	int		ifi_index;		/* Link index	*/
  	unsigned	ifi_flags;		/* IFF_* flags	*/
  	unsigned	ifi_change;		/* IFF_* change mask */
  };
  
  /********************************************************************
   *		prefix information 
   ****/
d94d9fee9   Eric Dumazet   net: cleanup incl...
414
  struct prefixmsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
  	unsigned char	prefix_family;
8a47077a0   Patrick McHardy   [NETLINK]: Missin...
416
417
  	unsigned char	prefix_pad1;
  	unsigned short	prefix_pad2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
419
420
421
  	int		prefix_ifindex;
  	unsigned char	prefix_type;
  	unsigned char	prefix_len;
  	unsigned char	prefix_flags;
8a47077a0   Patrick McHardy   [NETLINK]: Missin...
422
  	unsigned char	prefix_pad3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423
424
425
426
427
428
429
430
431
432
433
  };
  
  enum 
  {
  	PREFIX_UNSPEC,
  	PREFIX_ADDRESS,
  	PREFIX_CACHEINFO,
  	__PREFIX_MAX
  };
  
  #define PREFIX_MAX	(__PREFIX_MAX - 1)
d94d9fee9   Eric Dumazet   net: cleanup incl...
434
  struct prefix_cacheinfo {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
436
437
  	__u32	preferred_time;
  	__u32	valid_time;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
441
  
  /*****************************************************************
   *		Traffic control messages.
   ****/
d94d9fee9   Eric Dumazet   net: cleanup incl...
442
  struct tcmsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
445
446
447
448
449
450
  	unsigned char	tcm_family;
  	unsigned char	tcm__pad1;
  	unsigned short	tcm__pad2;
  	int		tcm_ifindex;
  	__u32		tcm_handle;
  	__u32		tcm_parent;
  	__u32		tcm_info;
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
451
  enum {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
453
454
455
456
457
458
459
  	TCA_UNSPEC,
  	TCA_KIND,
  	TCA_OPTIONS,
  	TCA_STATS,
  	TCA_XSTATS,
  	TCA_RATE,
  	TCA_FCNT,
  	TCA_STATS2,
175f9c1bb   Jussi Kivilinna   net_sched: Add si...
460
  	TCA_STAB,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
463
464
465
466
467
  	__TCA_MAX
  };
  
  #define TCA_MAX (__TCA_MAX - 1)
  
  #define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
  #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
31910575a   Pierre Ynard   [IPv6]: Export us...
468
469
470
  /********************************************************************
   *		Neighbor Discovery userland options
   ****/
d94d9fee9   Eric Dumazet   net: cleanup incl...
471
  struct nduseroptmsg {
31910575a   Pierre Ynard   [IPv6]: Export us...
472
473
474
  	unsigned char	nduseropt_family;
  	unsigned char	nduseropt_pad1;
  	unsigned short	nduseropt_opts_len;	/* Total length of options */
dbb2ed248   Pierre Ynard   [IPV6]: Add ifind...
475
  	int		nduseropt_ifindex;
31910575a   Pierre Ynard   [IPv6]: Export us...
476
477
478
  	__u8		nduseropt_icmp_type;
  	__u8		nduseropt_icmp_code;
  	unsigned short	nduseropt_pad2;
dbb2ed248   Pierre Ynard   [IPV6]: Add ifind...
479
  	unsigned int	nduseropt_pad3;
31910575a   Pierre Ynard   [IPv6]: Export us...
480
481
  	/* Followed by one or more ND options */
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
482
  enum {
31910575a   Pierre Ynard   [IPv6]: Export us...
483
484
485
486
487
488
  	NDUSEROPT_UNSPEC,
  	NDUSEROPT_SRCADDR,
  	__NDUSEROPT_MAX
  };
  
  #define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
489
490
  #ifndef __KERNEL__
  /* RTnetlink multicast groups - backwards compatibility for userspace */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
492
493
494
495
496
497
498
  #define RTMGRP_LINK		1
  #define RTMGRP_NOTIFY		2
  #define RTMGRP_NEIGH		4
  #define RTMGRP_TC		8
  
  #define RTMGRP_IPV4_IFADDR	0x10
  #define RTMGRP_IPV4_MROUTE	0x20
  #define RTMGRP_IPV4_ROUTE	0x40
a5cdc0300   Patrick McHardy   [IPV4]: Add fib r...
499
  #define RTMGRP_IPV4_RULE	0x80
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
501
502
503
504
505
506
507
508
509
  
  #define RTMGRP_IPV6_IFADDR	0x100
  #define RTMGRP_IPV6_MROUTE	0x200
  #define RTMGRP_IPV6_ROUTE	0x400
  #define RTMGRP_IPV6_IFINFO	0x800
  
  #define RTMGRP_DECnet_IFADDR    0x1000
  #define RTMGRP_DECnet_ROUTE     0x4000
  
  #define RTMGRP_IPV6_PREFIX	0x20000
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
  #endif
  
  /* RTnetlink multicast groups */
  enum rtnetlink_groups {
  	RTNLGRP_NONE,
  #define RTNLGRP_NONE		RTNLGRP_NONE
  	RTNLGRP_LINK,
  #define RTNLGRP_LINK		RTNLGRP_LINK
  	RTNLGRP_NOTIFY,
  #define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
  	RTNLGRP_NEIGH,
  #define RTNLGRP_NEIGH		RTNLGRP_NEIGH
  	RTNLGRP_TC,
  #define RTNLGRP_TC		RTNLGRP_TC
  	RTNLGRP_IPV4_IFADDR,
  #define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
  	RTNLGRP_IPV4_MROUTE,
  #define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
  	RTNLGRP_IPV4_ROUTE,
  #define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
a5cdc0300   Patrick McHardy   [IPV4]: Add fib r...
530
531
  	RTNLGRP_IPV4_RULE,
  #define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
532
533
534
535
536
537
538
539
540
541
  	RTNLGRP_IPV6_IFADDR,
  #define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
  	RTNLGRP_IPV6_MROUTE,
  #define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
  	RTNLGRP_IPV6_ROUTE,
  #define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
  	RTNLGRP_IPV6_IFINFO,
  #define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
  	RTNLGRP_DECnet_IFADDR,
  #define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
6b80ebedb   Kristian Slavov   [RTNETLINK]: Fix ...
542
  	RTNLGRP_NOP2,
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
543
544
  	RTNLGRP_DECnet_ROUTE,
  #define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
a8731cbf6   Steven Whitehouse   [DECNET]: Covert ...
545
546
  	RTNLGRP_DECnet_RULE,
  #define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
6b80ebedb   Kristian Slavov   [RTNETLINK]: Fix ...
547
  	RTNLGRP_NOP4,
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
548
549
  	RTNLGRP_IPV6_PREFIX,
  #define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
101367c2f   Thomas Graf   [IPV6]: Policy Ro...
550
551
  	RTNLGRP_IPV6_RULE,
  #define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
31910575a   Pierre Ynard   [IPv6]: Export us...
552
553
  	RTNLGRP_ND_USEROPT,
  #define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
bce7b1542   Remi Denis-Courmont   Phonet: global de...
554
555
556
557
  	RTNLGRP_PHONET_IFADDR,
  #define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
  	RTNLGRP_PHONET_ROUTE,
  #define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
ac6d439d2   Patrick McHardy   [NETLINK]: Conver...
558
559
560
  	__RTNLGRP_MAX
  };
  #define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
562
  
  /* TC action piece */
d94d9fee9   Eric Dumazet   net: cleanup incl...
563
  struct tcamsg {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
565
566
567
568
569
570
571
572
573
574
575
  	unsigned char	tca_family;
  	unsigned char	tca__pad1;
  	unsigned short	tca__pad2;
  };
  #define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
  #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
  #define TCA_ACT_TAB 1 /* attr type must be >=1 */	
  #define TCAA_MAX 1
  
  /* End of information exported to user level */
  
  #ifdef __KERNEL__
6756ae4b4   Stephen Hemminger   [NET]: Convert RT...
576
  #include <linux/mutex.h>
3b42a96dc   Andy Whitcroft   net: rtnetlink.h ...
577
  #include <linux/netdevice.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
580
581
582
583
  static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
  {
  	int len = strlen(str) + 1;
  	return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);
  }
97c53cacf   Denis V. Lunev   [NET]: Make rtnet...
584
585
  extern int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, u32 group, int echo);
  extern int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid);
1ce85fe40   Pablo Neira Ayuso   netlink: change n...
586
587
  extern void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid,
  			u32 group, struct nlmsghdr *nlh, gfp_t flags);
97c53cacf   Denis V. Lunev   [NET]: Make rtnet...
588
  extern void rtnl_set_sk_err(struct net *net, u32 group, int error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
  extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
e3703b3de   Thomas Graf   [RTNETLINK]: Add ...
590
591
592
  extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst,
  			      u32 id, u32 ts, u32 tsage, long expires,
  			      u32 error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
594
595
596
597
598
599
  
  extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
  
  #define RTA_PUT(skb, attrtype, attrlen, data) \
  ({	if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
  		 goto rtattr_failure; \
     	__rta_fill(skb, attrtype, attrlen, data); }) 
d675c989e   Thomas Graf   [PKT_SCHED]: Pack...
600
  #define RTA_APPEND(skb, attrlen, data) \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
602
  ({	if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \
  		goto rtattr_failure; \
d675c989e   Thomas Graf   [PKT_SCHED]: Pack...
603
604
605
  	memcpy(skb_put(skb, attrlen), data, attrlen); })
  
  #define RTA_PUT_NOHDR(skb, attrlen, data) \
b3563c4fb   Patrick McHardy   [NETLINK]: Clear ...
606
  ({	RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
607
  	memset(skb_tail_pointer(skb) - (RTA_ALIGN(attrlen) - attrlen), 0, \
b3563c4fb   Patrick McHardy   [NETLINK]: Clear ...
608
  	       RTA_ALIGN(attrlen) - attrlen); })
007682449   Thomas Graf   [NETLINK] Routing...
609

8f48bcd4e   Thomas Graf   [RTNETLINK]: Add ...
610
611
612
613
614
615
616
  #define RTA_PUT_U8(skb, attrtype, value) \
  ({	u8 _tmp = (value); \
  	RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); })
  
  #define RTA_PUT_U16(skb, attrtype, value) \
  ({	u16 _tmp = (value); \
  	RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); })
007682449   Thomas Graf   [NETLINK] Routing...
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
  #define RTA_PUT_U32(skb, attrtype, value) \
  ({	u32 _tmp = (value); \
  	RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); })
  
  #define RTA_PUT_U64(skb, attrtype, value) \
  ({	u64 _tmp = (value); \
  	RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); })
  
  #define RTA_PUT_SECS(skb, attrtype, value) \
  	RTA_PUT_U64(skb, attrtype, (value) / HZ)
  
  #define RTA_PUT_MSECS(skb, attrtype, value) \
  	RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value))
  
  #define RTA_PUT_STRING(skb, attrtype, value) \
  	RTA_PUT(skb, attrtype, strlen(value) + 1, value)
8f48bcd4e   Thomas Graf   [RTNETLINK]: Add ...
633
634
  #define RTA_PUT_FLAG(skb, attrtype) \
  	RTA_PUT(skb, attrtype, 0, NULL);
007682449   Thomas Graf   [NETLINK] Routing...
635
  #define RTA_NEST(skb, type) \
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
636
  ({	struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
007682449   Thomas Graf   [NETLINK] Routing...
637
638
639
640
  	RTA_PUT(skb, type, 0, NULL); \
  	__start;  })
  
  #define RTA_NEST_END(skb, start) \
27a884dc3   Arnaldo Carvalho de Melo   [SK_BUFF]: Conver...
641
  ({	(start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
007682449   Thomas Graf   [NETLINK] Routing...
642
  	(skb)->len; })
afdc3238e   Patrick McHardy   [RTNETLINK]: Add ...
643
644
645
646
647
648
649
650
651
652
653
  #define RTA_NEST_COMPAT(skb, type, attrlen, data) \
  ({	struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
  	RTA_PUT(skb, type, attrlen, data); \
  	RTA_NEST(skb, type); \
  	__start; })
  
  #define RTA_NEST_COMPAT_END(skb, start) \
  ({	struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
  	(start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
  	RTA_NEST_END(skb, __nest); \
  	(skb)->len; })
007682449   Thomas Graf   [NETLINK] Routing...
654
  #define RTA_NEST_CANCEL(skb, start) \
c52a3f89f   Thomas Graf   [NETLINK]: Fix RT...
655
656
  ({	if (start) \
  		skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
007682449   Thomas Graf   [NETLINK] Routing...
657
  	-1; })
8f48bcd4e   Thomas Graf   [RTNETLINK]: Add ...
658
659
660
661
662
663
664
665
666
  #define RTA_GET_U8(rta) \
  ({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \
  		goto rtattr_failure; \
  	*(u8 *) RTA_DATA(rta); })
  
  #define RTA_GET_U16(rta) \
  ({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \
  		goto rtattr_failure; \
  	*(u16 *) RTA_DATA(rta); })
007682449   Thomas Graf   [NETLINK] Routing...
667
668
669
670
671
672
673
674
675
676
677
  #define RTA_GET_U32(rta) \
  ({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \
  		goto rtattr_failure; \
  	*(u32 *) RTA_DATA(rta); })
  
  #define RTA_GET_U64(rta) \
  ({	u64 _tmp; \
  	if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \
  		goto rtattr_failure; \
  	memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \
  	_tmp; })
8f48bcd4e   Thomas Graf   [RTNETLINK]: Add ...
678
  #define RTA_GET_FLAG(rta) (!!(rta))
007682449   Thomas Graf   [NETLINK] Routing...
679
680
  #define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ)
  #define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
682
683
684
685
686
687
688
689
690
  		
  static inline struct rtattr *
  __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen)
  {
  	struct rtattr *rta;
  	int size = RTA_LENGTH(attrlen);
  
  	rta = (struct rtattr*)skb_put(skb, RTA_ALIGN(size));
  	rta->rta_type = attrtype;
  	rta->rta_len = size;
b3563c4fb   Patrick McHardy   [NETLINK]: Clear ...
691
  	memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
693
694
695
696
697
698
699
700
  	return rta;
  }
  
  #define __RTA_PUT(skb, attrtype, attrlen) \
  ({ 	if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
  		goto rtattr_failure; \
     	__rta_reserve(skb, attrtype, attrlen); })
  
  extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
6756ae4b4   Stephen Hemminger   [NET]: Convert RT...
701
  /* RTNL is used as a global lock for all changes to network configuration  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
702
  extern void rtnl_lock(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
703
  extern void rtnl_unlock(void);
6756ae4b4   Stephen Hemminger   [NET]: Convert RT...
704
  extern int rtnl_trylock(void);
c9c1014b2   Patrick McHardy   [RTNETLINK]: Fix ...
705
  extern int rtnl_is_locked(void);
a898def29   Paul E. McKenney   net: Add checking...
706
707
708
  #ifdef CONFIG_PROVE_LOCKING
  extern int lockdep_rtnl_is_held(void);
  #endif /* #ifdef CONFIG_PROVE_LOCKING */
6756ae4b4   Stephen Hemminger   [NET]: Convert RT...
709

a6e0fc851   Eric Dumazet   net: introduce rc...
710
711
712
713
714
  /**
   * rcu_dereference_rtnl - rcu_dereference with debug checking
   * @p: The pointer to read, prior to dereferencing
   *
   * Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
29fa060ea   David S. Miller   net: relax rtnl_d...
715
   * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference()
a6e0fc851   Eric Dumazet   net: introduce rc...
716
717
718
719
   */
  #define rcu_dereference_rtnl(p)					\
  	rcu_dereference_check(p, rcu_read_lock_held() ||	\
  				 lockdep_rtnl_is_held())
7dff59efb   Eric Dumazet   net: add rtnl_der...
720
  /**
29fa060ea   David S. Miller   net: relax rtnl_d...
721
   * rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL
7dff59efb   Eric Dumazet   net: add rtnl_der...
722
723
   * @p: The pointer to read, prior to dereferencing
   *
29fa060ea   David S. Miller   net: relax rtnl_d...
724
725
726
   * Return the value of the specified RCU-protected pointer, but omit
   * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because
   * caller holds RTNL.
7dff59efb   Eric Dumazet   net: add rtnl_der...
727
728
   */
  #define rtnl_dereference(p)					\
29fa060ea   David S. Miller   net: relax rtnl_d...
729
  	rcu_dereference_protected(p, lockdep_rtnl_is_held())
7dff59efb   Eric Dumazet   net: add rtnl_der...
730

24824a09e   Eric Dumazet   net: dynamic ingr...
731
732
733
734
735
736
  static inline struct netdev_queue *dev_ingress_queue(struct net_device *dev)
  {
  	return rtnl_dereference(dev->ingress_queue);
  }
  
  extern struct netdev_queue *dev_ingress_queue_create(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
  extern void rtnetlink_init(void);
6756ae4b4   Stephen Hemminger   [NET]: Convert RT...
738
  extern void __rtnl_unlock(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
  
  #define ASSERT_RTNL() do { \
c9c1014b2   Patrick McHardy   [RTNETLINK]: Fix ...
741
  	if (unlikely(!rtnl_is_locked())) { \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742
743
744
745
746
747
  		printk(KERN_ERR "RTNL: assertion failed at %s (%d)
  ", \
  		       __FILE__,  __LINE__); \
  		dump_stack(); \
  	} \
  } while(0)
9e762a4a8   Patrick McHardy   [NET]: Introduce ...
748
749
750
751
752
753
  static inline u32 rtm_get_table(struct rtattr **rta, u8 table)
  {
  	return RTA_GET_U32(rta[RTA_TABLE-1]);
  rtattr_failure:
  	return table;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
755
756
757
  #endif /* __KERNEL__ */
  
  
  #endif	/* __LINUX_RTNETLINK_H */