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