rtnetlink.h revision e5879dc603ca2e9f27ca6d754fdf5e20f8072344
1#ifndef __LINUX_RTNETLINK_H
2#define __LINUX_RTNETLINK_H
3
4#include <linux/netlink.h>
5
6/****
7 *		Routing/neighbour discovery messages.
8 ****/
9
10/* Types of messages */
11
12enum {
13	RTM_BASE	= 16,
14#define RTM_BASE	RTM_BASE
15
16	RTM_NEWLINK	= 16,
17#define RTM_NEWLINK	RTM_NEWLINK
18	RTM_DELLINK,
19#define RTM_DELLINK	RTM_DELLINK
20	RTM_GETLINK,
21#define RTM_GETLINK	RTM_GETLINK
22	RTM_SETLINK,
23#define RTM_SETLINK	RTM_SETLINK
24
25	RTM_NEWADDR	= 20,
26#define RTM_NEWADDR	RTM_NEWADDR
27	RTM_DELADDR,
28#define RTM_DELADDR	RTM_DELADDR
29	RTM_GETADDR,
30#define RTM_GETADDR	RTM_GETADDR
31
32	RTM_NEWROUTE	= 24,
33#define RTM_NEWROUTE	RTM_NEWROUTE
34	RTM_DELROUTE,
35#define RTM_DELROUTE	RTM_DELROUTE
36	RTM_GETROUTE,
37#define RTM_GETROUTE	RTM_GETROUTE
38
39	RTM_NEWNEIGH	= 28,
40#define RTM_NEWNEIGH	RTM_NEWNEIGH
41	RTM_DELNEIGH,
42#define RTM_DELNEIGH	RTM_DELNEIGH
43	RTM_GETNEIGH,
44#define RTM_GETNEIGH	RTM_GETNEIGH
45
46	RTM_NEWRULE	= 32,
47#define RTM_NEWRULE	RTM_NEWRULE
48	RTM_DELRULE,
49#define RTM_DELRULE	RTM_DELRULE
50	RTM_GETRULE,
51#define RTM_GETRULE	RTM_GETRULE
52
53	RTM_NEWQDISC	= 36,
54#define RTM_NEWQDISC	RTM_NEWQDISC
55	RTM_DELQDISC,
56#define RTM_DELQDISC	RTM_DELQDISC
57	RTM_GETQDISC,
58#define RTM_GETQDISC	RTM_GETQDISC
59
60	RTM_NEWTCLASS	= 40,
61#define RTM_NEWTCLASS	RTM_NEWTCLASS
62	RTM_DELTCLASS,
63#define RTM_DELTCLASS	RTM_DELTCLASS
64	RTM_GETTCLASS,
65#define RTM_GETTCLASS	RTM_GETTCLASS
66
67	RTM_NEWTFILTER	= 44,
68#define RTM_NEWTFILTER	RTM_NEWTFILTER
69	RTM_DELTFILTER,
70#define RTM_DELTFILTER	RTM_DELTFILTER
71	RTM_GETTFILTER,
72#define RTM_GETTFILTER	RTM_GETTFILTER
73
74	RTM_NEWACTION	= 48,
75#define RTM_NEWACTION   RTM_NEWACTION
76	RTM_DELACTION,
77#define RTM_DELACTION   RTM_DELACTION
78	RTM_GETACTION,
79#define RTM_GETACTION   RTM_GETACTION
80
81	RTM_NEWPREFIX	= 52,
82#define RTM_NEWPREFIX	RTM_NEWPREFIX
83	RTM_GETPREFIX	= 54,
84#define RTM_GETPREFIX	RTM_GETPREFIX
85
86	RTM_GETMULTICAST = 58,
87#define RTM_GETMULTICAST RTM_GETMULTICAST
88
89	RTM_GETANYCAST	= 62,
90#define RTM_GETANYCAST	RTM_GETANYCAST
91
92	RTM_MAX,
93#define RTM_MAX		RTM_MAX
94};
95
96/*
97   Generic structure for encapsulation of optional route information.
98   It is reminiscent of sockaddr, but with sa_family replaced
99   with attribute type.
100 */
101
102struct rtattr
103{
104	unsigned short	rta_len;
105	unsigned short	rta_type;
106};
107
108/* Macros to handle rtattributes */
109
110#define RTA_ALIGNTO	4
111#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
112#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
113			 (rta)->rta_len >= sizeof(struct rtattr) && \
114			 (rta)->rta_len <= (len))
115#define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
116				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
117#define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
118#define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
119#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
120#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
121
122
123
124
125/******************************************************************************
126 *		Definitions used in routing table administration.
127 ****/
128
129struct rtmsg
130{
131	unsigned char		rtm_family;
132	unsigned char		rtm_dst_len;
133	unsigned char		rtm_src_len;
134	unsigned char		rtm_tos;
135
136	unsigned char		rtm_table;	/* Routing table id */
137	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
138	unsigned char		rtm_scope;	/* See below */
139	unsigned char		rtm_type;	/* See below	*/
140
141	unsigned		rtm_flags;
142};
143
144/* rtm_type */
145
146enum
147{
148	RTN_UNSPEC,
149	RTN_UNICAST,		/* Gateway or direct route	*/
150	RTN_LOCAL,		/* Accept locally		*/
151	RTN_BROADCAST,		/* Accept locally as broadcast,
152				   send as broadcast */
153	RTN_ANYCAST,		/* Accept locally as broadcast,
154				   but send as unicast */
155	RTN_MULTICAST,		/* Multicast route		*/
156	RTN_BLACKHOLE,		/* Drop				*/
157	RTN_UNREACHABLE,	/* Destination is unreachable   */
158	RTN_PROHIBIT,		/* Administratively prohibited	*/
159	RTN_THROW,		/* Not in this table		*/
160	RTN_NAT,		/* Translate this address	*/
161	RTN_XRESOLVE,		/* Use external resolver	*/
162	__RTN_MAX
163};
164
165#define RTN_MAX (__RTN_MAX - 1)
166
167
168/* rtm_protocol */
169
170#define RTPROT_UNSPEC	0
171#define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
172				   not used by current IPv4 */
173#define RTPROT_KERNEL	2	/* Route installed by kernel		*/
174#define RTPROT_BOOT	3	/* Route installed during boot		*/
175#define RTPROT_STATIC	4	/* Route installed by administrator	*/
176
177/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
178   they are just passed from user and back as is.
179   It will be used by hypothetical multiple routing daemons.
180   Note that protocol values should be standardized in order to
181   avoid conflicts.
182 */
183
184#define RTPROT_GATED	8	/* Apparently, GateD */
185#define RTPROT_RA	9	/* RDISC/ND router advertisements */
186#define RTPROT_MRT	10	/* Merit MRT */
187#define RTPROT_ZEBRA	11	/* Zebra */
188#define RTPROT_BIRD	12	/* BIRD */
189#define RTPROT_DNROUTED	13	/* DECnet routing daemon */
190#define RTPROT_XORP	14	/* XORP */
191
192/* rtm_scope
193
194   Really it is not scope, but sort of distance to the destination.
195   NOWHERE are reserved for not existing destinations, HOST is our
196   local addresses, LINK are destinations, located on directly attached
197   link and UNIVERSE is everywhere in the Universe.
198
199   Intermediate values are also possible f.e. interior routes
200   could be assigned a value between UNIVERSE and LINK.
201*/
202
203enum rt_scope_t
204{
205	RT_SCOPE_UNIVERSE=0,
206/* User defined values  */
207	RT_SCOPE_SITE=200,
208	RT_SCOPE_LINK=253,
209	RT_SCOPE_HOST=254,
210	RT_SCOPE_NOWHERE=255
211};
212
213/* rtm_flags */
214
215#define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
216#define RTM_F_CLONED		0x200	/* This route is cloned		*/
217#define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
218#define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
219
220/* Reserved table identifiers */
221
222enum rt_class_t
223{
224	RT_TABLE_UNSPEC=0,
225/* User defined values */
226	RT_TABLE_DEFAULT=253,
227	RT_TABLE_MAIN=254,
228	RT_TABLE_LOCAL=255,
229	__RT_TABLE_MAX
230};
231#define RT_TABLE_MAX (__RT_TABLE_MAX - 1)
232
233
234
235/* Routing message attributes */
236
237enum rtattr_type_t
238{
239	RTA_UNSPEC,
240	RTA_DST,
241	RTA_SRC,
242	RTA_IIF,
243	RTA_OIF,
244	RTA_GATEWAY,
245	RTA_PRIORITY,
246	RTA_PREFSRC,
247	RTA_METRICS,
248	RTA_MULTIPATH,
249	RTA_PROTOINFO,
250	RTA_FLOW,
251	RTA_CACHEINFO,
252	RTA_SESSION,
253	__RTA_MAX
254};
255
256#define RTA_MAX (__RTA_MAX - 1)
257
258#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
259#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
260
261/* RTM_MULTIPATH --- array of struct rtnexthop.
262 *
263 * "struct rtnexthop" describes all necessary nexthop information,
264 * i.e. parameters of path to a destination via this nexthop.
265 *
266 * At the moment it is impossible to set different prefsrc, mtu, window
267 * and rtt for different paths from multipath.
268 */
269
270struct rtnexthop
271{
272	unsigned short		rtnh_len;
273	unsigned char		rtnh_flags;
274	unsigned char		rtnh_hops;
275	int			rtnh_ifindex;
276};
277
278/* rtnh_flags */
279
280#define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
281#define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
282#define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
283
284/* Macros to handle hexthops */
285
286#define RTNH_ALIGNTO	4
287#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
288#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
289			   ((int)(rtnh)->rtnh_len) <= (len))
290#define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
291#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
292#define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
293#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
294
295/* RTM_CACHEINFO */
296
297struct rta_cacheinfo
298{
299	__u32	rta_clntref;
300	__u32	rta_lastuse;
301	__s32	rta_expires;
302	__u32	rta_error;
303	__u32	rta_used;
304
305#define RTNETLINK_HAVE_PEERINFO 1
306	__u32	rta_id;
307	__u32	rta_ts;
308	__u32	rta_tsage;
309};
310
311/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
312
313enum
314{
315	RTAX_UNSPEC,
316#define RTAX_UNSPEC RTAX_UNSPEC
317	RTAX_LOCK,
318#define RTAX_LOCK RTAX_LOCK
319	RTAX_MTU,
320#define RTAX_MTU RTAX_MTU
321	RTAX_WINDOW,
322#define RTAX_WINDOW RTAX_WINDOW
323	RTAX_RTT,
324#define RTAX_RTT RTAX_RTT
325	RTAX_RTTVAR,
326#define RTAX_RTTVAR RTAX_RTTVAR
327	RTAX_SSTHRESH,
328#define RTAX_SSTHRESH RTAX_SSTHRESH
329	RTAX_CWND,
330#define RTAX_CWND RTAX_CWND
331	RTAX_ADVMSS,
332#define RTAX_ADVMSS RTAX_ADVMSS
333	RTAX_REORDERING,
334#define RTAX_REORDERING RTAX_REORDERING
335	RTAX_HOPLIMIT,
336#define RTAX_HOPLIMIT RTAX_HOPLIMIT
337	RTAX_INITCWND,
338#define RTAX_INITCWND RTAX_INITCWND
339	RTAX_FEATURES,
340#define RTAX_FEATURES RTAX_FEATURES
341	__RTAX_MAX
342};
343
344#define RTAX_MAX (__RTAX_MAX - 1)
345
346#define RTAX_FEATURE_ECN	0x00000001
347#define RTAX_FEATURE_SACK	0x00000002
348#define RTAX_FEATURE_TIMESTAMP	0x00000004
349
350struct rta_session
351{
352	__u8	proto;
353
354	union {
355		struct {
356			__u16	sport;
357			__u16	dport;
358		} ports;
359
360		struct {
361			__u8	type;
362			__u8	code;
363			__u16	ident;
364		} icmpt;
365
366		__u32		spi;
367	} u;
368};
369
370
371/*********************************************************
372 *		Interface address.
373 ****/
374
375struct ifaddrmsg
376{
377	unsigned char	ifa_family;
378	unsigned char	ifa_prefixlen;	/* The prefix length		*/
379	unsigned char	ifa_flags;	/* Flags			*/
380	unsigned char	ifa_scope;	/* See above			*/
381	int		ifa_index;	/* Link index			*/
382};
383
384enum
385{
386	IFA_UNSPEC,
387	IFA_ADDRESS,
388	IFA_LOCAL,
389	IFA_LABEL,
390	IFA_BROADCAST,
391	IFA_ANYCAST,
392	IFA_CACHEINFO,
393	IFA_MULTICAST,
394	__IFA_MAX
395};
396
397#define IFA_MAX (__IFA_MAX - 1)
398
399/* ifa_flags */
400
401#define IFA_F_SECONDARY		0x01
402#define IFA_F_TEMPORARY		IFA_F_SECONDARY
403
404#define IFA_F_DEPRECATED	0x20
405#define IFA_F_TENTATIVE		0x40
406#define IFA_F_PERMANENT		0x80
407
408struct ifa_cacheinfo
409{
410	__u32	ifa_prefered;
411	__u32	ifa_valid;
412	__u32	cstamp; /* created timestamp, hundredths of seconds */
413	__u32	tstamp; /* updated timestamp, hundredths of seconds */
414};
415
416
417#define IFA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
418#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
419
420/*
421   Important comment:
422   IFA_ADDRESS is prefix address, rather than local interface address.
423   It makes no difference for normally configured broadcast interfaces,
424   but for point-to-point IFA_ADDRESS is DESTINATION address,
425   local address is supplied in IFA_LOCAL attribute.
426 */
427
428/**************************************************************
429 *		Neighbour discovery.
430 ****/
431
432struct ndmsg
433{
434	unsigned char	ndm_family;
435	unsigned char	ndm_pad1;
436	unsigned short	ndm_pad2;
437	int		ndm_ifindex;	/* Link index			*/
438	__u16		ndm_state;
439	__u8		ndm_flags;
440	__u8		ndm_type;
441};
442
443enum
444{
445	NDA_UNSPEC,
446	NDA_DST,
447	NDA_LLADDR,
448	NDA_CACHEINFO,
449	__NDA_MAX
450};
451
452#define NDA_MAX (__NDA_MAX - 1)
453
454#define NDA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
455#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
456
457/*
458 *	Neighbor Cache Entry Flags
459 */
460
461#define NTF_PROXY	0x08	/* == ATF_PUBL */
462#define NTF_ROUTER	0x80
463
464/*
465 *	Neighbor Cache Entry States.
466 */
467
468#define NUD_INCOMPLETE	0x01
469#define NUD_REACHABLE	0x02
470#define NUD_STALE	0x04
471#define NUD_DELAY	0x08
472#define NUD_PROBE	0x10
473#define NUD_FAILED	0x20
474
475/* Dummy states */
476#define NUD_NOARP	0x40
477#define NUD_PERMANENT	0x80
478#define NUD_NONE	0x00
479
480
481struct nda_cacheinfo
482{
483	__u32		ndm_confirmed;
484	__u32		ndm_used;
485	__u32		ndm_updated;
486	__u32		ndm_refcnt;
487};
488
489/****
490 *		General form of address family dependent message.
491 ****/
492
493struct rtgenmsg
494{
495	unsigned char		rtgen_family;
496};
497
498/*****************************************************************
499 *		Link layer specific messages.
500 ****/
501
502/* struct ifinfomsg
503 * passes link level specific information, not dependent
504 * on network protocol.
505 */
506
507struct ifinfomsg
508{
509	unsigned char	ifi_family;
510	unsigned char	__ifi_pad;
511	unsigned short	ifi_type;		/* ARPHRD_* */
512	int		ifi_index;		/* Link index	*/
513	unsigned	ifi_flags;		/* IFF_* flags	*/
514	unsigned	ifi_change;		/* IFF_* change mask */
515};
516
517/********************************************************************
518 *		prefix information
519 ****/
520
521struct prefixmsg
522{
523	unsigned char	prefix_family;
524	int		prefix_ifindex;
525	unsigned char	prefix_type;
526	unsigned char	prefix_len;
527	unsigned char	prefix_flags;
528};
529
530enum
531{
532	PREFIX_UNSPEC,
533	PREFIX_ADDRESS,
534	PREFIX_CACHEINFO,
535	__PREFIX_MAX
536};
537
538#define PREFIX_MAX	(__PREFIX_MAX - 1)
539
540struct prefix_cacheinfo
541{
542	__u32	preferred_time;
543	__u32	valid_time;
544};
545
546/* The struct should be in sync with struct net_device_stats */
547struct rtnl_link_stats
548{
549	__u32	rx_packets;		/* total packets received	*/
550	__u32	tx_packets;		/* total packets transmitted	*/
551	__u32	rx_bytes;		/* total bytes received 	*/
552	__u32	tx_bytes;		/* total bytes transmitted	*/
553	__u32	rx_errors;		/* bad packets received		*/
554	__u32	tx_errors;		/* packet transmit problems	*/
555	__u32	rx_dropped;		/* no space in linux buffers	*/
556	__u32	tx_dropped;		/* no space available in linux	*/
557	__u32	multicast;		/* multicast packets received	*/
558	__u32	collisions;
559
560	/* detailed rx_errors: */
561	__u32	rx_length_errors;
562	__u32	rx_over_errors;		/* receiver ring buff overflow	*/
563	__u32	rx_crc_errors;		/* recved pkt with crc error	*/
564	__u32	rx_frame_errors;	/* recv'd frame alignment error */
565	__u32	rx_fifo_errors;		/* recv'r fifo overrun		*/
566	__u32	rx_missed_errors;	/* receiver missed packet	*/
567
568	/* detailed tx_errors */
569	__u32	tx_aborted_errors;
570	__u32	tx_carrier_errors;
571	__u32	tx_fifo_errors;
572	__u32	tx_heartbeat_errors;
573	__u32	tx_window_errors;
574
575	/* for cslip etc */
576	__u32	rx_compressed;
577	__u32	tx_compressed;
578};
579
580/* The struct should be in sync with struct ifmap */
581struct rtnl_link_ifmap
582{
583	__u64	mem_start;
584	__u64	mem_end;
585	__u64	base_addr;
586	__u16	irq;
587	__u8	dma;
588	__u8	port;
589};
590
591enum
592{
593	IFLA_UNSPEC,
594	IFLA_ADDRESS,
595	IFLA_BROADCAST,
596	IFLA_IFNAME,
597	IFLA_MTU,
598	IFLA_LINK,
599	IFLA_QDISC,
600	IFLA_STATS,
601	IFLA_COST,
602#define IFLA_COST IFLA_COST
603	IFLA_PRIORITY,
604#define IFLA_PRIORITY IFLA_PRIORITY
605	IFLA_MASTER,
606#define IFLA_MASTER IFLA_MASTER
607	IFLA_WIRELESS,		/* Wireless Extension event - see wireless.h */
608#define IFLA_WIRELESS IFLA_WIRELESS
609	IFLA_PROTINFO,		/* Protocol specific information for a link */
610#define IFLA_PROTINFO IFLA_PROTINFO
611	IFLA_TXQLEN,
612#define IFLA_TXQLEN IFLA_TXQLEN
613	IFLA_MAP,
614#define IFLA_MAP IFLA_MAP
615	IFLA_WEIGHT,
616#define IFLA_WEIGHT IFLA_WEIGHT
617	__IFLA_MAX
618};
619
620
621#define IFLA_MAX (__IFLA_MAX - 1)
622
623#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
624#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
625
626/* ifi_flags.
627
628   IFF_* flags.
629
630   The only change is:
631   IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
632   more not changeable by user. They describe link media
633   characteristics and set by device driver.
634
635   Comments:
636   - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
637   - If neither of these three flags are set;
638     the interface is NBMA.
639
640   - IFF_MULTICAST does not mean anything special:
641   multicasts can be used on all not-NBMA links.
642   IFF_MULTICAST means that this media uses special encapsulation
643   for multicast frames. Apparently, all IFF_POINTOPOINT and
644   IFF_BROADCAST devices are able to use multicasts too.
645 */
646
647/* IFLA_LINK.
648   For usual devices it is equal ifi_index.
649   If it is a "virtual interface" (f.e. tunnel), ifi_link
650   can point to real physical interface (f.e. for bandwidth calculations),
651   or maybe 0, what means, that real media is unknown (usual
652   for IPIP tunnels, when route to endpoint is allowed to change)
653 */
654
655/* Subtype attributes for IFLA_PROTINFO */
656enum
657{
658	IFLA_INET6_UNSPEC,
659	IFLA_INET6_FLAGS,	/* link flags			*/
660	IFLA_INET6_CONF,	/* sysctl parameters		*/
661	IFLA_INET6_STATS,	/* statistics			*/
662	IFLA_INET6_MCAST,	/* MC things. What of them?	*/
663	IFLA_INET6_CACHEINFO,	/* time values and max reasm size */
664	__IFLA_INET6_MAX
665};
666
667#define IFLA_INET6_MAX	(__IFLA_INET6_MAX - 1)
668
669struct ifla_cacheinfo
670{
671	__u32	max_reasm_len;
672	__u32	tstamp;		/* ipv6InterfaceTable updated timestamp */
673	__u32	reachable_time;
674	__u32	retrans_time;
675};
676
677/*****************************************************************
678 *		Traffic control messages.
679 ****/
680
681struct tcmsg
682{
683	unsigned char	tcm_family;
684	unsigned char	tcm__pad1;
685	unsigned short	tcm__pad2;
686	int		tcm_ifindex;
687	__u32		tcm_handle;
688	__u32		tcm_parent;
689	__u32		tcm_info;
690};
691
692enum
693{
694	TCA_UNSPEC,
695	TCA_KIND,
696	TCA_OPTIONS,
697	TCA_STATS,
698	TCA_XSTATS,
699	TCA_RATE,
700	TCA_FCNT,
701	TCA_STATS2,
702	TCA_ACT_STATS,
703	__TCA_MAX
704};
705
706#define TCA_MAX (__TCA_MAX - 1)
707
708#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
709#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
710
711
712/* RTnetlink multicast groups */
713
714#define RTMGRP_LINK		1
715#define RTMGRP_NOTIFY		2
716#define RTMGRP_NEIGH		4
717#define RTMGRP_TC		8
718
719#define RTMGRP_IPV4_IFADDR	0x10
720#define RTMGRP_IPV4_MROUTE	0x20
721#define RTMGRP_IPV4_ROUTE	0x40
722
723#define RTMGRP_IPV6_IFADDR	0x100
724#define RTMGRP_IPV6_MROUTE	0x200
725#define RTMGRP_IPV6_ROUTE	0x400
726#define RTMGRP_IPV6_IFINFO	0x800
727
728#define RTMGRP_DECnet_IFADDR    0x1000
729#define RTMGRP_DECnet_ROUTE     0x4000
730
731#define RTMGRP_IPV6_PREFIX	0x20000
732
733/* TC action piece */
734struct tcamsg
735{
736	unsigned char	tca_family;
737	unsigned char	tca__pad1;
738	unsigned short	tca__pad2;
739};
740#define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
741#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
742#define TCA_ACT_TAB 1 /* attr type must be >=1 */
743#define TCAA_MAX 1
744
745/* End of information exported to user level */
746
747
748
749#endif	/* __LINUX_RTNETLINK_H */
750