xref: /OK3568_Linux_fs/kernel/include/uapi/linux/rtnetlink.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _UAPI__LINUX_RTNETLINK_H
3*4882a593Smuzhiyun #define _UAPI__LINUX_RTNETLINK_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/netlink.h>
7*4882a593Smuzhiyun #include <linux/if_link.h>
8*4882a593Smuzhiyun #include <linux/if_addr.h>
9*4882a593Smuzhiyun #include <linux/neighbour.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /* rtnetlink families. Values up to 127 are reserved for real address
12*4882a593Smuzhiyun  * families, values above 128 may be used arbitrarily.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun #define RTNL_FAMILY_IPMR		128
15*4882a593Smuzhiyun #define RTNL_FAMILY_IP6MR		129
16*4882a593Smuzhiyun #define RTNL_FAMILY_MAX			129
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /****
19*4882a593Smuzhiyun  *		Routing/neighbour discovery messages.
20*4882a593Smuzhiyun  ****/
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* Types of messages */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun enum {
25*4882a593Smuzhiyun 	RTM_BASE	= 16,
26*4882a593Smuzhiyun #define RTM_BASE	RTM_BASE
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	RTM_NEWLINK	= 16,
29*4882a593Smuzhiyun #define RTM_NEWLINK	RTM_NEWLINK
30*4882a593Smuzhiyun 	RTM_DELLINK,
31*4882a593Smuzhiyun #define RTM_DELLINK	RTM_DELLINK
32*4882a593Smuzhiyun 	RTM_GETLINK,
33*4882a593Smuzhiyun #define RTM_GETLINK	RTM_GETLINK
34*4882a593Smuzhiyun 	RTM_SETLINK,
35*4882a593Smuzhiyun #define RTM_SETLINK	RTM_SETLINK
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	RTM_NEWADDR	= 20,
38*4882a593Smuzhiyun #define RTM_NEWADDR	RTM_NEWADDR
39*4882a593Smuzhiyun 	RTM_DELADDR,
40*4882a593Smuzhiyun #define RTM_DELADDR	RTM_DELADDR
41*4882a593Smuzhiyun 	RTM_GETADDR,
42*4882a593Smuzhiyun #define RTM_GETADDR	RTM_GETADDR
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	RTM_NEWROUTE	= 24,
45*4882a593Smuzhiyun #define RTM_NEWROUTE	RTM_NEWROUTE
46*4882a593Smuzhiyun 	RTM_DELROUTE,
47*4882a593Smuzhiyun #define RTM_DELROUTE	RTM_DELROUTE
48*4882a593Smuzhiyun 	RTM_GETROUTE,
49*4882a593Smuzhiyun #define RTM_GETROUTE	RTM_GETROUTE
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	RTM_NEWNEIGH	= 28,
52*4882a593Smuzhiyun #define RTM_NEWNEIGH	RTM_NEWNEIGH
53*4882a593Smuzhiyun 	RTM_DELNEIGH,
54*4882a593Smuzhiyun #define RTM_DELNEIGH	RTM_DELNEIGH
55*4882a593Smuzhiyun 	RTM_GETNEIGH,
56*4882a593Smuzhiyun #define RTM_GETNEIGH	RTM_GETNEIGH
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	RTM_NEWRULE	= 32,
59*4882a593Smuzhiyun #define RTM_NEWRULE	RTM_NEWRULE
60*4882a593Smuzhiyun 	RTM_DELRULE,
61*4882a593Smuzhiyun #define RTM_DELRULE	RTM_DELRULE
62*4882a593Smuzhiyun 	RTM_GETRULE,
63*4882a593Smuzhiyun #define RTM_GETRULE	RTM_GETRULE
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	RTM_NEWQDISC	= 36,
66*4882a593Smuzhiyun #define RTM_NEWQDISC	RTM_NEWQDISC
67*4882a593Smuzhiyun 	RTM_DELQDISC,
68*4882a593Smuzhiyun #define RTM_DELQDISC	RTM_DELQDISC
69*4882a593Smuzhiyun 	RTM_GETQDISC,
70*4882a593Smuzhiyun #define RTM_GETQDISC	RTM_GETQDISC
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	RTM_NEWTCLASS	= 40,
73*4882a593Smuzhiyun #define RTM_NEWTCLASS	RTM_NEWTCLASS
74*4882a593Smuzhiyun 	RTM_DELTCLASS,
75*4882a593Smuzhiyun #define RTM_DELTCLASS	RTM_DELTCLASS
76*4882a593Smuzhiyun 	RTM_GETTCLASS,
77*4882a593Smuzhiyun #define RTM_GETTCLASS	RTM_GETTCLASS
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	RTM_NEWTFILTER	= 44,
80*4882a593Smuzhiyun #define RTM_NEWTFILTER	RTM_NEWTFILTER
81*4882a593Smuzhiyun 	RTM_DELTFILTER,
82*4882a593Smuzhiyun #define RTM_DELTFILTER	RTM_DELTFILTER
83*4882a593Smuzhiyun 	RTM_GETTFILTER,
84*4882a593Smuzhiyun #define RTM_GETTFILTER	RTM_GETTFILTER
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	RTM_NEWACTION	= 48,
87*4882a593Smuzhiyun #define RTM_NEWACTION   RTM_NEWACTION
88*4882a593Smuzhiyun 	RTM_DELACTION,
89*4882a593Smuzhiyun #define RTM_DELACTION   RTM_DELACTION
90*4882a593Smuzhiyun 	RTM_GETACTION,
91*4882a593Smuzhiyun #define RTM_GETACTION   RTM_GETACTION
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	RTM_NEWPREFIX	= 52,
94*4882a593Smuzhiyun #define RTM_NEWPREFIX	RTM_NEWPREFIX
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	RTM_GETMULTICAST = 58,
97*4882a593Smuzhiyun #define RTM_GETMULTICAST RTM_GETMULTICAST
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	RTM_GETANYCAST	= 62,
100*4882a593Smuzhiyun #define RTM_GETANYCAST	RTM_GETANYCAST
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	RTM_NEWNEIGHTBL	= 64,
103*4882a593Smuzhiyun #define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
104*4882a593Smuzhiyun 	RTM_GETNEIGHTBL	= 66,
105*4882a593Smuzhiyun #define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
106*4882a593Smuzhiyun 	RTM_SETNEIGHTBL,
107*4882a593Smuzhiyun #define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	RTM_NEWNDUSEROPT = 68,
110*4882a593Smuzhiyun #define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	RTM_NEWADDRLABEL = 72,
113*4882a593Smuzhiyun #define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
114*4882a593Smuzhiyun 	RTM_DELADDRLABEL,
115*4882a593Smuzhiyun #define RTM_DELADDRLABEL RTM_DELADDRLABEL
116*4882a593Smuzhiyun 	RTM_GETADDRLABEL,
117*4882a593Smuzhiyun #define RTM_GETADDRLABEL RTM_GETADDRLABEL
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	RTM_GETDCB = 78,
120*4882a593Smuzhiyun #define RTM_GETDCB RTM_GETDCB
121*4882a593Smuzhiyun 	RTM_SETDCB,
122*4882a593Smuzhiyun #define RTM_SETDCB RTM_SETDCB
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	RTM_NEWNETCONF = 80,
125*4882a593Smuzhiyun #define RTM_NEWNETCONF RTM_NEWNETCONF
126*4882a593Smuzhiyun 	RTM_DELNETCONF,
127*4882a593Smuzhiyun #define RTM_DELNETCONF RTM_DELNETCONF
128*4882a593Smuzhiyun 	RTM_GETNETCONF = 82,
129*4882a593Smuzhiyun #define RTM_GETNETCONF RTM_GETNETCONF
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	RTM_NEWMDB = 84,
132*4882a593Smuzhiyun #define RTM_NEWMDB RTM_NEWMDB
133*4882a593Smuzhiyun 	RTM_DELMDB = 85,
134*4882a593Smuzhiyun #define RTM_DELMDB RTM_DELMDB
135*4882a593Smuzhiyun 	RTM_GETMDB = 86,
136*4882a593Smuzhiyun #define RTM_GETMDB RTM_GETMDB
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	RTM_NEWNSID = 88,
139*4882a593Smuzhiyun #define RTM_NEWNSID RTM_NEWNSID
140*4882a593Smuzhiyun 	RTM_DELNSID = 89,
141*4882a593Smuzhiyun #define RTM_DELNSID RTM_DELNSID
142*4882a593Smuzhiyun 	RTM_GETNSID = 90,
143*4882a593Smuzhiyun #define RTM_GETNSID RTM_GETNSID
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	RTM_NEWSTATS = 92,
146*4882a593Smuzhiyun #define RTM_NEWSTATS RTM_NEWSTATS
147*4882a593Smuzhiyun 	RTM_GETSTATS = 94,
148*4882a593Smuzhiyun #define RTM_GETSTATS RTM_GETSTATS
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	RTM_NEWCACHEREPORT = 96,
151*4882a593Smuzhiyun #define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	RTM_NEWCHAIN = 100,
154*4882a593Smuzhiyun #define RTM_NEWCHAIN RTM_NEWCHAIN
155*4882a593Smuzhiyun 	RTM_DELCHAIN,
156*4882a593Smuzhiyun #define RTM_DELCHAIN RTM_DELCHAIN
157*4882a593Smuzhiyun 	RTM_GETCHAIN,
158*4882a593Smuzhiyun #define RTM_GETCHAIN RTM_GETCHAIN
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	RTM_NEWNEXTHOP = 104,
161*4882a593Smuzhiyun #define RTM_NEWNEXTHOP	RTM_NEWNEXTHOP
162*4882a593Smuzhiyun 	RTM_DELNEXTHOP,
163*4882a593Smuzhiyun #define RTM_DELNEXTHOP	RTM_DELNEXTHOP
164*4882a593Smuzhiyun 	RTM_GETNEXTHOP,
165*4882a593Smuzhiyun #define RTM_GETNEXTHOP	RTM_GETNEXTHOP
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	RTM_NEWLINKPROP = 108,
168*4882a593Smuzhiyun #define RTM_NEWLINKPROP	RTM_NEWLINKPROP
169*4882a593Smuzhiyun 	RTM_DELLINKPROP,
170*4882a593Smuzhiyun #define RTM_DELLINKPROP	RTM_DELLINKPROP
171*4882a593Smuzhiyun 	RTM_GETLINKPROP,
172*4882a593Smuzhiyun #define RTM_GETLINKPROP	RTM_GETLINKPROP
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	RTM_NEWVLAN = 112,
175*4882a593Smuzhiyun #define RTM_NEWNVLAN	RTM_NEWVLAN
176*4882a593Smuzhiyun 	RTM_DELVLAN,
177*4882a593Smuzhiyun #define RTM_DELVLAN	RTM_DELVLAN
178*4882a593Smuzhiyun 	RTM_GETVLAN,
179*4882a593Smuzhiyun #define RTM_GETVLAN	RTM_GETVLAN
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	__RTM_MAX,
182*4882a593Smuzhiyun #define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
186*4882a593Smuzhiyun #define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
187*4882a593Smuzhiyun #define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /*
190*4882a593Smuzhiyun    Generic structure for encapsulation of optional route information.
191*4882a593Smuzhiyun    It is reminiscent of sockaddr, but with sa_family replaced
192*4882a593Smuzhiyun    with attribute type.
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct rtattr {
196*4882a593Smuzhiyun 	unsigned short	rta_len;
197*4882a593Smuzhiyun 	unsigned short	rta_type;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* Macros to handle rtattributes */
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun #define RTA_ALIGNTO	4U
203*4882a593Smuzhiyun #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
204*4882a593Smuzhiyun #define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
205*4882a593Smuzhiyun 			 (rta)->rta_len >= sizeof(struct rtattr) && \
206*4882a593Smuzhiyun 			 (rta)->rta_len <= (len))
207*4882a593Smuzhiyun #define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
208*4882a593Smuzhiyun 				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
209*4882a593Smuzhiyun #define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
210*4882a593Smuzhiyun #define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
211*4882a593Smuzhiyun #define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
212*4882a593Smuzhiyun #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /******************************************************************************
218*4882a593Smuzhiyun  *		Definitions used in routing table administration.
219*4882a593Smuzhiyun  ****/
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun struct rtmsg {
222*4882a593Smuzhiyun 	unsigned char		rtm_family;
223*4882a593Smuzhiyun 	unsigned char		rtm_dst_len;
224*4882a593Smuzhiyun 	unsigned char		rtm_src_len;
225*4882a593Smuzhiyun 	unsigned char		rtm_tos;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	unsigned char		rtm_table;	/* Routing table id */
228*4882a593Smuzhiyun 	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
229*4882a593Smuzhiyun 	unsigned char		rtm_scope;	/* See below */
230*4882a593Smuzhiyun 	unsigned char		rtm_type;	/* See below	*/
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	unsigned		rtm_flags;
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun /* rtm_type */
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun enum {
238*4882a593Smuzhiyun 	RTN_UNSPEC,
239*4882a593Smuzhiyun 	RTN_UNICAST,		/* Gateway or direct route	*/
240*4882a593Smuzhiyun 	RTN_LOCAL,		/* Accept locally		*/
241*4882a593Smuzhiyun 	RTN_BROADCAST,		/* Accept locally as broadcast,
242*4882a593Smuzhiyun 				   send as broadcast */
243*4882a593Smuzhiyun 	RTN_ANYCAST,		/* Accept locally as broadcast,
244*4882a593Smuzhiyun 				   but send as unicast */
245*4882a593Smuzhiyun 	RTN_MULTICAST,		/* Multicast route		*/
246*4882a593Smuzhiyun 	RTN_BLACKHOLE,		/* Drop				*/
247*4882a593Smuzhiyun 	RTN_UNREACHABLE,	/* Destination is unreachable   */
248*4882a593Smuzhiyun 	RTN_PROHIBIT,		/* Administratively prohibited	*/
249*4882a593Smuzhiyun 	RTN_THROW,		/* Not in this table		*/
250*4882a593Smuzhiyun 	RTN_NAT,		/* Translate this address	*/
251*4882a593Smuzhiyun 	RTN_XRESOLVE,		/* Use external resolver	*/
252*4882a593Smuzhiyun 	__RTN_MAX
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #define RTN_MAX (__RTN_MAX - 1)
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /* rtm_protocol */
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun #define RTPROT_UNSPEC		0
261*4882a593Smuzhiyun #define RTPROT_REDIRECT		1	/* Route installed by ICMP redirects;
262*4882a593Smuzhiyun 					   not used by current IPv4 */
263*4882a593Smuzhiyun #define RTPROT_KERNEL		2	/* Route installed by kernel		*/
264*4882a593Smuzhiyun #define RTPROT_BOOT		3	/* Route installed during boot		*/
265*4882a593Smuzhiyun #define RTPROT_STATIC		4	/* Route installed by administrator	*/
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
268*4882a593Smuzhiyun    they are just passed from user and back as is.
269*4882a593Smuzhiyun    It will be used by hypothetical multiple routing daemons.
270*4882a593Smuzhiyun    Note that protocol values should be standardized in order to
271*4882a593Smuzhiyun    avoid conflicts.
272*4882a593Smuzhiyun  */
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun #define RTPROT_GATED		8	/* Apparently, GateD */
275*4882a593Smuzhiyun #define RTPROT_RA		9	/* RDISC/ND router advertisements */
276*4882a593Smuzhiyun #define RTPROT_MRT		10	/* Merit MRT */
277*4882a593Smuzhiyun #define RTPROT_ZEBRA		11	/* Zebra */
278*4882a593Smuzhiyun #define RTPROT_BIRD		12	/* BIRD */
279*4882a593Smuzhiyun #define RTPROT_DNROUTED		13	/* DECnet routing daemon */
280*4882a593Smuzhiyun #define RTPROT_XORP		14	/* XORP */
281*4882a593Smuzhiyun #define RTPROT_NTK		15	/* Netsukuku */
282*4882a593Smuzhiyun #define RTPROT_DHCP		16	/* DHCP client */
283*4882a593Smuzhiyun #define RTPROT_MROUTED		17	/* Multicast daemon */
284*4882a593Smuzhiyun #define RTPROT_KEEPALIVED	18	/* Keepalived daemon */
285*4882a593Smuzhiyun #define RTPROT_BABEL		42	/* Babel daemon */
286*4882a593Smuzhiyun #define RTPROT_BGP		186	/* BGP Routes */
287*4882a593Smuzhiyun #define RTPROT_ISIS		187	/* ISIS Routes */
288*4882a593Smuzhiyun #define RTPROT_OSPF		188	/* OSPF Routes */
289*4882a593Smuzhiyun #define RTPROT_RIP		189	/* RIP Routes */
290*4882a593Smuzhiyun #define RTPROT_EIGRP		192	/* EIGRP Routes */
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun /* rtm_scope
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun    Really it is not scope, but sort of distance to the destination.
295*4882a593Smuzhiyun    NOWHERE are reserved for not existing destinations, HOST is our
296*4882a593Smuzhiyun    local addresses, LINK are destinations, located on directly attached
297*4882a593Smuzhiyun    link and UNIVERSE is everywhere in the Universe.
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun    Intermediate values are also possible f.e. interior routes
300*4882a593Smuzhiyun    could be assigned a value between UNIVERSE and LINK.
301*4882a593Smuzhiyun */
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun enum rt_scope_t {
304*4882a593Smuzhiyun 	RT_SCOPE_UNIVERSE=0,
305*4882a593Smuzhiyun /* User defined values  */
306*4882a593Smuzhiyun 	RT_SCOPE_SITE=200,
307*4882a593Smuzhiyun 	RT_SCOPE_LINK=253,
308*4882a593Smuzhiyun 	RT_SCOPE_HOST=254,
309*4882a593Smuzhiyun 	RT_SCOPE_NOWHERE=255
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /* rtm_flags */
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun #define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
315*4882a593Smuzhiyun #define RTM_F_CLONED		0x200	/* This route is cloned		*/
316*4882a593Smuzhiyun #define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
317*4882a593Smuzhiyun #define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
318*4882a593Smuzhiyun #define RTM_F_LOOKUP_TABLE	0x1000	/* set rtm_table to FIB lookup result */
319*4882a593Smuzhiyun #define RTM_F_FIB_MATCH	        0x2000	/* return full fib lookup match */
320*4882a593Smuzhiyun #define RTM_F_OFFLOAD		0x4000	/* route is offloaded */
321*4882a593Smuzhiyun #define RTM_F_TRAP		0x8000	/* route is trapping packets */
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /* Reserved table identifiers */
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun enum rt_class_t {
326*4882a593Smuzhiyun 	RT_TABLE_UNSPEC=0,
327*4882a593Smuzhiyun /* User defined values */
328*4882a593Smuzhiyun 	RT_TABLE_COMPAT=252,
329*4882a593Smuzhiyun 	RT_TABLE_DEFAULT=253,
330*4882a593Smuzhiyun 	RT_TABLE_MAIN=254,
331*4882a593Smuzhiyun 	RT_TABLE_LOCAL=255,
332*4882a593Smuzhiyun 	RT_TABLE_MAX=0xFFFFFFFF
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun /* Routing message attributes */
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun enum rtattr_type_t {
339*4882a593Smuzhiyun 	RTA_UNSPEC,
340*4882a593Smuzhiyun 	RTA_DST,
341*4882a593Smuzhiyun 	RTA_SRC,
342*4882a593Smuzhiyun 	RTA_IIF,
343*4882a593Smuzhiyun 	RTA_OIF,
344*4882a593Smuzhiyun 	RTA_GATEWAY,
345*4882a593Smuzhiyun 	RTA_PRIORITY,
346*4882a593Smuzhiyun 	RTA_PREFSRC,
347*4882a593Smuzhiyun 	RTA_METRICS,
348*4882a593Smuzhiyun 	RTA_MULTIPATH,
349*4882a593Smuzhiyun 	RTA_PROTOINFO, /* no longer used */
350*4882a593Smuzhiyun 	RTA_FLOW,
351*4882a593Smuzhiyun 	RTA_CACHEINFO,
352*4882a593Smuzhiyun 	RTA_SESSION, /* no longer used */
353*4882a593Smuzhiyun 	RTA_MP_ALGO, /* no longer used */
354*4882a593Smuzhiyun 	RTA_TABLE,
355*4882a593Smuzhiyun 	RTA_MARK,
356*4882a593Smuzhiyun 	RTA_MFC_STATS,
357*4882a593Smuzhiyun 	RTA_VIA,
358*4882a593Smuzhiyun 	RTA_NEWDST,
359*4882a593Smuzhiyun 	RTA_PREF,
360*4882a593Smuzhiyun 	RTA_ENCAP_TYPE,
361*4882a593Smuzhiyun 	RTA_ENCAP,
362*4882a593Smuzhiyun 	RTA_EXPIRES,
363*4882a593Smuzhiyun 	RTA_PAD,
364*4882a593Smuzhiyun 	RTA_UID,
365*4882a593Smuzhiyun 	RTA_TTL_PROPAGATE,
366*4882a593Smuzhiyun 	RTA_IP_PROTO,
367*4882a593Smuzhiyun 	RTA_SPORT,
368*4882a593Smuzhiyun 	RTA_DPORT,
369*4882a593Smuzhiyun 	RTA_NH_ID,
370*4882a593Smuzhiyun 	__RTA_MAX
371*4882a593Smuzhiyun };
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun #define RTA_MAX (__RTA_MAX - 1)
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun #define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
376*4882a593Smuzhiyun #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /* RTM_MULTIPATH --- array of struct rtnexthop.
379*4882a593Smuzhiyun  *
380*4882a593Smuzhiyun  * "struct rtnexthop" describes all necessary nexthop information,
381*4882a593Smuzhiyun  * i.e. parameters of path to a destination via this nexthop.
382*4882a593Smuzhiyun  *
383*4882a593Smuzhiyun  * At the moment it is impossible to set different prefsrc, mtu, window
384*4882a593Smuzhiyun  * and rtt for different paths from multipath.
385*4882a593Smuzhiyun  */
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun struct rtnexthop {
388*4882a593Smuzhiyun 	unsigned short		rtnh_len;
389*4882a593Smuzhiyun 	unsigned char		rtnh_flags;
390*4882a593Smuzhiyun 	unsigned char		rtnh_hops;
391*4882a593Smuzhiyun 	int			rtnh_ifindex;
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /* rtnh_flags */
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
397*4882a593Smuzhiyun #define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
398*4882a593Smuzhiyun #define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
399*4882a593Smuzhiyun #define RTNH_F_OFFLOAD		8	/* offloaded route */
400*4882a593Smuzhiyun #define RTNH_F_LINKDOWN		16	/* carrier-down on nexthop */
401*4882a593Smuzhiyun #define RTNH_F_UNRESOLVED	32	/* The entry is unresolved (ipmr) */
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun #define RTNH_COMPARE_MASK	(RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD)
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun /* Macros to handle hexthops */
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun #define RTNH_ALIGNTO	4
408*4882a593Smuzhiyun #define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
409*4882a593Smuzhiyun #define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
410*4882a593Smuzhiyun 			   ((int)(rtnh)->rtnh_len) <= (len))
411*4882a593Smuzhiyun #define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
412*4882a593Smuzhiyun #define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
413*4882a593Smuzhiyun #define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
414*4882a593Smuzhiyun #define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /* RTA_VIA */
417*4882a593Smuzhiyun struct rtvia {
418*4882a593Smuzhiyun 	__kernel_sa_family_t	rtvia_family;
419*4882a593Smuzhiyun 	__u8			rtvia_addr[0];
420*4882a593Smuzhiyun };
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun /* RTM_CACHEINFO */
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun struct rta_cacheinfo {
425*4882a593Smuzhiyun 	__u32	rta_clntref;
426*4882a593Smuzhiyun 	__u32	rta_lastuse;
427*4882a593Smuzhiyun 	__s32	rta_expires;
428*4882a593Smuzhiyun 	__u32	rta_error;
429*4882a593Smuzhiyun 	__u32	rta_used;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun #define RTNETLINK_HAVE_PEERINFO 1
432*4882a593Smuzhiyun 	__u32	rta_id;
433*4882a593Smuzhiyun 	__u32	rta_ts;
434*4882a593Smuzhiyun 	__u32	rta_tsage;
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun /* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun enum {
440*4882a593Smuzhiyun 	RTAX_UNSPEC,
441*4882a593Smuzhiyun #define RTAX_UNSPEC RTAX_UNSPEC
442*4882a593Smuzhiyun 	RTAX_LOCK,
443*4882a593Smuzhiyun #define RTAX_LOCK RTAX_LOCK
444*4882a593Smuzhiyun 	RTAX_MTU,
445*4882a593Smuzhiyun #define RTAX_MTU RTAX_MTU
446*4882a593Smuzhiyun 	RTAX_WINDOW,
447*4882a593Smuzhiyun #define RTAX_WINDOW RTAX_WINDOW
448*4882a593Smuzhiyun 	RTAX_RTT,
449*4882a593Smuzhiyun #define RTAX_RTT RTAX_RTT
450*4882a593Smuzhiyun 	RTAX_RTTVAR,
451*4882a593Smuzhiyun #define RTAX_RTTVAR RTAX_RTTVAR
452*4882a593Smuzhiyun 	RTAX_SSTHRESH,
453*4882a593Smuzhiyun #define RTAX_SSTHRESH RTAX_SSTHRESH
454*4882a593Smuzhiyun 	RTAX_CWND,
455*4882a593Smuzhiyun #define RTAX_CWND RTAX_CWND
456*4882a593Smuzhiyun 	RTAX_ADVMSS,
457*4882a593Smuzhiyun #define RTAX_ADVMSS RTAX_ADVMSS
458*4882a593Smuzhiyun 	RTAX_REORDERING,
459*4882a593Smuzhiyun #define RTAX_REORDERING RTAX_REORDERING
460*4882a593Smuzhiyun 	RTAX_HOPLIMIT,
461*4882a593Smuzhiyun #define RTAX_HOPLIMIT RTAX_HOPLIMIT
462*4882a593Smuzhiyun 	RTAX_INITCWND,
463*4882a593Smuzhiyun #define RTAX_INITCWND RTAX_INITCWND
464*4882a593Smuzhiyun 	RTAX_FEATURES,
465*4882a593Smuzhiyun #define RTAX_FEATURES RTAX_FEATURES
466*4882a593Smuzhiyun 	RTAX_RTO_MIN,
467*4882a593Smuzhiyun #define RTAX_RTO_MIN RTAX_RTO_MIN
468*4882a593Smuzhiyun 	RTAX_INITRWND,
469*4882a593Smuzhiyun #define RTAX_INITRWND RTAX_INITRWND
470*4882a593Smuzhiyun 	RTAX_QUICKACK,
471*4882a593Smuzhiyun #define RTAX_QUICKACK RTAX_QUICKACK
472*4882a593Smuzhiyun 	RTAX_CC_ALGO,
473*4882a593Smuzhiyun #define RTAX_CC_ALGO RTAX_CC_ALGO
474*4882a593Smuzhiyun 	RTAX_FASTOPEN_NO_COOKIE,
475*4882a593Smuzhiyun #define RTAX_FASTOPEN_NO_COOKIE RTAX_FASTOPEN_NO_COOKIE
476*4882a593Smuzhiyun 	__RTAX_MAX
477*4882a593Smuzhiyun };
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun #define RTAX_MAX (__RTAX_MAX - 1)
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun #define RTAX_FEATURE_ECN	(1 << 0)
482*4882a593Smuzhiyun #define RTAX_FEATURE_SACK	(1 << 1)
483*4882a593Smuzhiyun #define RTAX_FEATURE_TIMESTAMP	(1 << 2)
484*4882a593Smuzhiyun #define RTAX_FEATURE_ALLFRAG	(1 << 3)
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun #define RTAX_FEATURE_MASK	(RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \
487*4882a593Smuzhiyun 				 RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun struct rta_session {
490*4882a593Smuzhiyun 	__u8	proto;
491*4882a593Smuzhiyun 	__u8	pad1;
492*4882a593Smuzhiyun 	__u16	pad2;
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	union {
495*4882a593Smuzhiyun 		struct {
496*4882a593Smuzhiyun 			__u16	sport;
497*4882a593Smuzhiyun 			__u16	dport;
498*4882a593Smuzhiyun 		} ports;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 		struct {
501*4882a593Smuzhiyun 			__u8	type;
502*4882a593Smuzhiyun 			__u8	code;
503*4882a593Smuzhiyun 			__u16	ident;
504*4882a593Smuzhiyun 		} icmpt;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 		__u32		spi;
507*4882a593Smuzhiyun 	} u;
508*4882a593Smuzhiyun };
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun struct rta_mfc_stats {
511*4882a593Smuzhiyun 	__u64	mfcs_packets;
512*4882a593Smuzhiyun 	__u64	mfcs_bytes;
513*4882a593Smuzhiyun 	__u64	mfcs_wrong_if;
514*4882a593Smuzhiyun };
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun /****
517*4882a593Smuzhiyun  *		General form of address family dependent message.
518*4882a593Smuzhiyun  ****/
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun struct rtgenmsg {
521*4882a593Smuzhiyun 	unsigned char		rtgen_family;
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun /*****************************************************************
525*4882a593Smuzhiyun  *		Link layer specific messages.
526*4882a593Smuzhiyun  ****/
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun /* struct ifinfomsg
529*4882a593Smuzhiyun  * passes link level specific information, not dependent
530*4882a593Smuzhiyun  * on network protocol.
531*4882a593Smuzhiyun  */
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun struct ifinfomsg {
534*4882a593Smuzhiyun 	unsigned char	ifi_family;
535*4882a593Smuzhiyun 	unsigned char	__ifi_pad;
536*4882a593Smuzhiyun 	unsigned short	ifi_type;		/* ARPHRD_* */
537*4882a593Smuzhiyun 	int		ifi_index;		/* Link index	*/
538*4882a593Smuzhiyun 	unsigned	ifi_flags;		/* IFF_* flags	*/
539*4882a593Smuzhiyun 	unsigned	ifi_change;		/* IFF_* change mask */
540*4882a593Smuzhiyun };
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun /********************************************************************
543*4882a593Smuzhiyun  *		prefix information
544*4882a593Smuzhiyun  ****/
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun struct prefixmsg {
547*4882a593Smuzhiyun 	unsigned char	prefix_family;
548*4882a593Smuzhiyun 	unsigned char	prefix_pad1;
549*4882a593Smuzhiyun 	unsigned short	prefix_pad2;
550*4882a593Smuzhiyun 	int		prefix_ifindex;
551*4882a593Smuzhiyun 	unsigned char	prefix_type;
552*4882a593Smuzhiyun 	unsigned char	prefix_len;
553*4882a593Smuzhiyun 	unsigned char	prefix_flags;
554*4882a593Smuzhiyun 	unsigned char	prefix_pad3;
555*4882a593Smuzhiyun };
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun enum
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun 	PREFIX_UNSPEC,
560*4882a593Smuzhiyun 	PREFIX_ADDRESS,
561*4882a593Smuzhiyun 	PREFIX_CACHEINFO,
562*4882a593Smuzhiyun 	__PREFIX_MAX
563*4882a593Smuzhiyun };
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun #define PREFIX_MAX	(__PREFIX_MAX - 1)
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun struct prefix_cacheinfo {
568*4882a593Smuzhiyun 	__u32	preferred_time;
569*4882a593Smuzhiyun 	__u32	valid_time;
570*4882a593Smuzhiyun };
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun /*****************************************************************
574*4882a593Smuzhiyun  *		Traffic control messages.
575*4882a593Smuzhiyun  ****/
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun struct tcmsg {
578*4882a593Smuzhiyun 	unsigned char	tcm_family;
579*4882a593Smuzhiyun 	unsigned char	tcm__pad1;
580*4882a593Smuzhiyun 	unsigned short	tcm__pad2;
581*4882a593Smuzhiyun 	int		tcm_ifindex;
582*4882a593Smuzhiyun 	__u32		tcm_handle;
583*4882a593Smuzhiyun 	__u32		tcm_parent;
584*4882a593Smuzhiyun /* tcm_block_index is used instead of tcm_parent
585*4882a593Smuzhiyun  * in case tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK
586*4882a593Smuzhiyun  */
587*4882a593Smuzhiyun #define tcm_block_index tcm_parent
588*4882a593Smuzhiyun 	__u32		tcm_info;
589*4882a593Smuzhiyun };
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun /* For manipulation of filters in shared block, tcm_ifindex is set to
592*4882a593Smuzhiyun  * TCM_IFINDEX_MAGIC_BLOCK, and tcm_parent is aliased to tcm_block_index
593*4882a593Smuzhiyun  * which is the block index.
594*4882a593Smuzhiyun  */
595*4882a593Smuzhiyun #define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU)
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun enum {
598*4882a593Smuzhiyun 	TCA_UNSPEC,
599*4882a593Smuzhiyun 	TCA_KIND,
600*4882a593Smuzhiyun 	TCA_OPTIONS,
601*4882a593Smuzhiyun 	TCA_STATS,
602*4882a593Smuzhiyun 	TCA_XSTATS,
603*4882a593Smuzhiyun 	TCA_RATE,
604*4882a593Smuzhiyun 	TCA_FCNT,
605*4882a593Smuzhiyun 	TCA_STATS2,
606*4882a593Smuzhiyun 	TCA_STAB,
607*4882a593Smuzhiyun 	TCA_PAD,
608*4882a593Smuzhiyun 	TCA_DUMP_INVISIBLE,
609*4882a593Smuzhiyun 	TCA_CHAIN,
610*4882a593Smuzhiyun 	TCA_HW_OFFLOAD,
611*4882a593Smuzhiyun 	TCA_INGRESS_BLOCK,
612*4882a593Smuzhiyun 	TCA_EGRESS_BLOCK,
613*4882a593Smuzhiyun 	TCA_DUMP_FLAGS,
614*4882a593Smuzhiyun 	__TCA_MAX
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #define TCA_MAX (__TCA_MAX - 1)
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun #define TCA_DUMP_FLAGS_TERSE (1 << 0) /* Means that in dump user gets only basic
620*4882a593Smuzhiyun 				       * data necessary to identify the objects
621*4882a593Smuzhiyun 				       * (handle, cookie, etc.) and stats.
622*4882a593Smuzhiyun 				       */
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun #define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
625*4882a593Smuzhiyun #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun /********************************************************************
628*4882a593Smuzhiyun  *		Neighbor Discovery userland options
629*4882a593Smuzhiyun  ****/
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun struct nduseroptmsg {
632*4882a593Smuzhiyun 	unsigned char	nduseropt_family;
633*4882a593Smuzhiyun 	unsigned char	nduseropt_pad1;
634*4882a593Smuzhiyun 	unsigned short	nduseropt_opts_len;	/* Total length of options */
635*4882a593Smuzhiyun 	int		nduseropt_ifindex;
636*4882a593Smuzhiyun 	__u8		nduseropt_icmp_type;
637*4882a593Smuzhiyun 	__u8		nduseropt_icmp_code;
638*4882a593Smuzhiyun 	unsigned short	nduseropt_pad2;
639*4882a593Smuzhiyun 	unsigned int	nduseropt_pad3;
640*4882a593Smuzhiyun 	/* Followed by one or more ND options */
641*4882a593Smuzhiyun };
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun enum {
644*4882a593Smuzhiyun 	NDUSEROPT_UNSPEC,
645*4882a593Smuzhiyun 	NDUSEROPT_SRCADDR,
646*4882a593Smuzhiyun 	__NDUSEROPT_MAX
647*4882a593Smuzhiyun };
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun #define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun #ifndef __KERNEL__
652*4882a593Smuzhiyun /* RTnetlink multicast groups - backwards compatibility for userspace */
653*4882a593Smuzhiyun #define RTMGRP_LINK		1
654*4882a593Smuzhiyun #define RTMGRP_NOTIFY		2
655*4882a593Smuzhiyun #define RTMGRP_NEIGH		4
656*4882a593Smuzhiyun #define RTMGRP_TC		8
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun #define RTMGRP_IPV4_IFADDR	0x10
659*4882a593Smuzhiyun #define RTMGRP_IPV4_MROUTE	0x20
660*4882a593Smuzhiyun #define RTMGRP_IPV4_ROUTE	0x40
661*4882a593Smuzhiyun #define RTMGRP_IPV4_RULE	0x80
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun #define RTMGRP_IPV6_IFADDR	0x100
664*4882a593Smuzhiyun #define RTMGRP_IPV6_MROUTE	0x200
665*4882a593Smuzhiyun #define RTMGRP_IPV6_ROUTE	0x400
666*4882a593Smuzhiyun #define RTMGRP_IPV6_IFINFO	0x800
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun #define RTMGRP_DECnet_IFADDR    0x1000
669*4882a593Smuzhiyun #define RTMGRP_DECnet_ROUTE     0x4000
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun #define RTMGRP_IPV6_PREFIX	0x20000
672*4882a593Smuzhiyun #endif
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun /* RTnetlink multicast groups */
675*4882a593Smuzhiyun enum rtnetlink_groups {
676*4882a593Smuzhiyun 	RTNLGRP_NONE,
677*4882a593Smuzhiyun #define RTNLGRP_NONE		RTNLGRP_NONE
678*4882a593Smuzhiyun 	RTNLGRP_LINK,
679*4882a593Smuzhiyun #define RTNLGRP_LINK		RTNLGRP_LINK
680*4882a593Smuzhiyun 	RTNLGRP_NOTIFY,
681*4882a593Smuzhiyun #define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
682*4882a593Smuzhiyun 	RTNLGRP_NEIGH,
683*4882a593Smuzhiyun #define RTNLGRP_NEIGH		RTNLGRP_NEIGH
684*4882a593Smuzhiyun 	RTNLGRP_TC,
685*4882a593Smuzhiyun #define RTNLGRP_TC		RTNLGRP_TC
686*4882a593Smuzhiyun 	RTNLGRP_IPV4_IFADDR,
687*4882a593Smuzhiyun #define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
688*4882a593Smuzhiyun 	RTNLGRP_IPV4_MROUTE,
689*4882a593Smuzhiyun #define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
690*4882a593Smuzhiyun 	RTNLGRP_IPV4_ROUTE,
691*4882a593Smuzhiyun #define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
692*4882a593Smuzhiyun 	RTNLGRP_IPV4_RULE,
693*4882a593Smuzhiyun #define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
694*4882a593Smuzhiyun 	RTNLGRP_IPV6_IFADDR,
695*4882a593Smuzhiyun #define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
696*4882a593Smuzhiyun 	RTNLGRP_IPV6_MROUTE,
697*4882a593Smuzhiyun #define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
698*4882a593Smuzhiyun 	RTNLGRP_IPV6_ROUTE,
699*4882a593Smuzhiyun #define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
700*4882a593Smuzhiyun 	RTNLGRP_IPV6_IFINFO,
701*4882a593Smuzhiyun #define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
702*4882a593Smuzhiyun 	RTNLGRP_DECnet_IFADDR,
703*4882a593Smuzhiyun #define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
704*4882a593Smuzhiyun 	RTNLGRP_NOP2,
705*4882a593Smuzhiyun 	RTNLGRP_DECnet_ROUTE,
706*4882a593Smuzhiyun #define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
707*4882a593Smuzhiyun 	RTNLGRP_DECnet_RULE,
708*4882a593Smuzhiyun #define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
709*4882a593Smuzhiyun 	RTNLGRP_NOP4,
710*4882a593Smuzhiyun 	RTNLGRP_IPV6_PREFIX,
711*4882a593Smuzhiyun #define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
712*4882a593Smuzhiyun 	RTNLGRP_IPV6_RULE,
713*4882a593Smuzhiyun #define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
714*4882a593Smuzhiyun 	RTNLGRP_ND_USEROPT,
715*4882a593Smuzhiyun #define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
716*4882a593Smuzhiyun 	RTNLGRP_PHONET_IFADDR,
717*4882a593Smuzhiyun #define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
718*4882a593Smuzhiyun 	RTNLGRP_PHONET_ROUTE,
719*4882a593Smuzhiyun #define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
720*4882a593Smuzhiyun 	RTNLGRP_DCB,
721*4882a593Smuzhiyun #define RTNLGRP_DCB		RTNLGRP_DCB
722*4882a593Smuzhiyun 	RTNLGRP_IPV4_NETCONF,
723*4882a593Smuzhiyun #define RTNLGRP_IPV4_NETCONF	RTNLGRP_IPV4_NETCONF
724*4882a593Smuzhiyun 	RTNLGRP_IPV6_NETCONF,
725*4882a593Smuzhiyun #define RTNLGRP_IPV6_NETCONF	RTNLGRP_IPV6_NETCONF
726*4882a593Smuzhiyun 	RTNLGRP_MDB,
727*4882a593Smuzhiyun #define RTNLGRP_MDB		RTNLGRP_MDB
728*4882a593Smuzhiyun 	RTNLGRP_MPLS_ROUTE,
729*4882a593Smuzhiyun #define RTNLGRP_MPLS_ROUTE	RTNLGRP_MPLS_ROUTE
730*4882a593Smuzhiyun 	RTNLGRP_NSID,
731*4882a593Smuzhiyun #define RTNLGRP_NSID		RTNLGRP_NSID
732*4882a593Smuzhiyun 	RTNLGRP_MPLS_NETCONF,
733*4882a593Smuzhiyun #define RTNLGRP_MPLS_NETCONF	RTNLGRP_MPLS_NETCONF
734*4882a593Smuzhiyun 	RTNLGRP_IPV4_MROUTE_R,
735*4882a593Smuzhiyun #define RTNLGRP_IPV4_MROUTE_R	RTNLGRP_IPV4_MROUTE_R
736*4882a593Smuzhiyun 	RTNLGRP_IPV6_MROUTE_R,
737*4882a593Smuzhiyun #define RTNLGRP_IPV6_MROUTE_R	RTNLGRP_IPV6_MROUTE_R
738*4882a593Smuzhiyun 	RTNLGRP_NEXTHOP,
739*4882a593Smuzhiyun #define RTNLGRP_NEXTHOP		RTNLGRP_NEXTHOP
740*4882a593Smuzhiyun 	RTNLGRP_BRVLAN,
741*4882a593Smuzhiyun #define RTNLGRP_BRVLAN		RTNLGRP_BRVLAN
742*4882a593Smuzhiyun 	__RTNLGRP_MAX
743*4882a593Smuzhiyun };
744*4882a593Smuzhiyun #define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun /* TC action piece */
747*4882a593Smuzhiyun struct tcamsg {
748*4882a593Smuzhiyun 	unsigned char	tca_family;
749*4882a593Smuzhiyun 	unsigned char	tca__pad1;
750*4882a593Smuzhiyun 	unsigned short	tca__pad2;
751*4882a593Smuzhiyun };
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun enum {
754*4882a593Smuzhiyun 	TCA_ROOT_UNSPEC,
755*4882a593Smuzhiyun 	TCA_ROOT_TAB,
756*4882a593Smuzhiyun #define TCA_ACT_TAB TCA_ROOT_TAB
757*4882a593Smuzhiyun #define TCAA_MAX TCA_ROOT_TAB
758*4882a593Smuzhiyun 	TCA_ROOT_FLAGS,
759*4882a593Smuzhiyun 	TCA_ROOT_COUNT,
760*4882a593Smuzhiyun 	TCA_ROOT_TIME_DELTA, /* in msecs */
761*4882a593Smuzhiyun 	__TCA_ROOT_MAX,
762*4882a593Smuzhiyun #define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
763*4882a593Smuzhiyun };
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun #define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
766*4882a593Smuzhiyun #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
767*4882a593Smuzhiyun /* tcamsg flags stored in attribute TCA_ROOT_FLAGS
768*4882a593Smuzhiyun  *
769*4882a593Smuzhiyun  * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO
770*4882a593Smuzhiyun  * actions in a dump. All dump responses will contain the number of actions
771*4882a593Smuzhiyun  * being dumped stored in for user app's consumption in TCA_ROOT_COUNT
772*4882a593Smuzhiyun  *
773*4882a593Smuzhiyun  */
774*4882a593Smuzhiyun #define TCA_FLAG_LARGE_DUMP_ON		(1 << 0)
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun /* New extended info filters for IFLA_EXT_MASK */
777*4882a593Smuzhiyun #define RTEXT_FILTER_VF		(1 << 0)
778*4882a593Smuzhiyun #define RTEXT_FILTER_BRVLAN	(1 << 1)
779*4882a593Smuzhiyun #define RTEXT_FILTER_BRVLAN_COMPRESSED	(1 << 2)
780*4882a593Smuzhiyun #define	RTEXT_FILTER_SKIP_STATS	(1 << 3)
781*4882a593Smuzhiyun #define RTEXT_FILTER_MRP	(1 << 4)
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun /* End of information exported to user level */
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun #endif /* _UAPI__LINUX_RTNETLINK_H */
788