1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_RTNETLINK_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_RTNETLINK_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#include <linux/types.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/netlink.h>
6faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#include <linux/if_link.h>
7faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#include <linux/if_addr.h>
8faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#include <linux/neighbour.h>
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
106cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt/* rtnetlink families. Values up to 127 are reserved for real address
116cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt * families, values above 128 may be used arbitrarily.
126cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt */
136cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#define RTNL_FAMILY_IPMR		128
146cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#define RTNL_FAMILY_IP6MR		129
156cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#define RTNL_FAMILY_MAX			129
166cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/****
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		Routing/neighbour discovery messages.
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Types of messages */
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum {
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_BASE	= 16,
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_BASE	RTM_BASE
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWLINK	= 16,
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWLINK	RTM_NEWLINK
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELLINK,
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELLINK	RTM_DELLINK
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETLINK,
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETLINK	RTM_GETLINK
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_SETLINK,
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_SETLINK	RTM_SETLINK
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWADDR	= 20,
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWADDR	RTM_NEWADDR
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELADDR,
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELADDR	RTM_DELADDR
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETADDR,
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETADDR	RTM_GETADDR
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWROUTE	= 24,
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWROUTE	RTM_NEWROUTE
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELROUTE,
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELROUTE	RTM_DELROUTE
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETROUTE,
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETROUTE	RTM_GETROUTE
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWNEIGH	= 28,
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWNEIGH	RTM_NEWNEIGH
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELNEIGH,
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELNEIGH	RTM_DELNEIGH
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETNEIGH,
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETNEIGH	RTM_GETNEIGH
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWRULE	= 32,
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWRULE	RTM_NEWRULE
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELRULE,
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELRULE	RTM_DELRULE
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETRULE,
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETRULE	RTM_GETRULE
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWQDISC	= 36,
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWQDISC	RTM_NEWQDISC
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELQDISC,
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELQDISC	RTM_DELQDISC
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETQDISC,
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETQDISC	RTM_GETQDISC
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWTCLASS	= 40,
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWTCLASS	RTM_NEWTCLASS
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELTCLASS,
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELTCLASS	RTM_DELTCLASS
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETTCLASS,
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETTCLASS	RTM_GETTCLASS
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWTFILTER	= 44,
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWTFILTER	RTM_NEWTFILTER
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELTFILTER,
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELTFILTER	RTM_DELTFILTER
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETTFILTER,
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETTFILTER	RTM_GETTFILTER
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWACTION	= 48,
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWACTION   RTM_NEWACTION
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_DELACTION,
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_DELACTION   RTM_DELACTION
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETACTION,
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETACTION   RTM_GETACTION
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWPREFIX	= 52,
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWPREFIX	RTM_NEWPREFIX
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETMULTICAST = 58,
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETMULTICAST RTM_GETMULTICAST
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETANYCAST	= 62,
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETANYCAST	RTM_GETANYCAST
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_NEWNEIGHTBL	= 64,
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_GETNEIGHTBL	= 66,
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTM_SETNEIGHTBL,
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
108faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_NEWNDUSEROPT = 68,
109faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
110faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
111faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_NEWADDRLABEL = 72,
112faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
113faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_DELADDRLABEL,
114faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_DELADDRLABEL RTM_DELADDRLABEL
115faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_GETADDRLABEL,
116faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_GETADDRLABEL RTM_GETADDRLABEL
117faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
118faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_GETDCB = 78,
119faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_GETDCB RTM_GETDCB
120faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTM_SETDCB,
121faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTM_SETDCB RTM_SETDCB
122faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__RTM_MAX,
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Generic structure for encapsulation of optional route information.
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   It is reminiscent of sockaddr, but with sa_family replaced
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   with attribute type.
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
1376cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rtattr {
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	rta_len;
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	rta_type;
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Macros to handle rtattributes */
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_ALIGNTO	4
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 (rta)->rta_len >= sizeof(struct rtattr) && \
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 (rta)->rta_len <= (len))
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/******************************************************************************
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		Definitions used in routing table administration.
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
1636cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rtmsg {
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_family;
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_dst_len;
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_src_len;
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_tos;
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_table;	/* Routing table id */
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_scope;	/* See below */
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtm_type;	/* See below	*/
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned		rtm_flags;
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rtm_type */
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
1796cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum {
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_UNSPEC,
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_UNICAST,		/* Gateway or direct route	*/
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_LOCAL,		/* Accept locally		*/
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_BROADCAST,		/* Accept locally as broadcast,
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   send as broadcast */
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_ANYCAST,		/* Accept locally as broadcast,
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   but send as unicast */
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_MULTICAST,		/* Multicast route		*/
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_BLACKHOLE,		/* Drop				*/
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_UNREACHABLE,	/* Destination is unreachable   */
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_PROHIBIT,		/* Administratively prohibited	*/
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_THROW,		/* Not in this table		*/
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_NAT,		/* Translate this address	*/
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTN_XRESOLVE,		/* Use external resolver	*/
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__RTN_MAX
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTN_MAX (__RTN_MAX - 1)
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rtm_protocol */
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_UNSPEC	0
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   not used by current IPv4 */
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_KERNEL	2	/* Route installed by kernel		*/
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_BOOT	3	/* Route installed during boot		*/
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_STATIC	4	/* Route installed by administrator	*/
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   they are just passed from user and back as is.
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   It will be used by hypothetical multiple routing daemons.
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Note that protocol values should be standardized in order to
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   avoid conflicts.
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_GATED	8	/* Apparently, GateD */
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_RA	9	/* RDISC/ND router advertisements */
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_MRT	10	/* Merit MRT */
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_ZEBRA	11	/* Zebra */
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_BIRD	12	/* BIRD */
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_DNROUTED	13	/* DECnet routing daemon */
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_XORP	14	/* XORP */
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTPROT_NTK	15	/* Netsukuku */
224faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTPROT_DHCP	16      /* DHCP client */
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rtm_scope
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Really it is not scope, but sort of distance to the destination.
229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   NOWHERE are reserved for not existing destinations, HOST is our
230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   local addresses, LINK are destinations, located on directly attached
231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   link and UNIVERSE is everywhere in the Universe.
232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   Intermediate values are also possible f.e. interior routes
234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   could be assigned a value between UNIVERSE and LINK.
235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru*/
236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
2376cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum rt_scope_t {
238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_SCOPE_UNIVERSE=0,
239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* User defined values  */
240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_SCOPE_SITE=200,
241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_SCOPE_LINK=253,
242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_SCOPE_HOST=254,
243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_SCOPE_NOWHERE=255
244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rtm_flags */
247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_F_CLONED		0x200	/* This route is cloned		*/
250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Reserved table identifiers */
254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
2556cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum rt_class_t {
256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_TABLE_UNSPEC=0,
257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* User defined values */
258faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RT_TABLE_COMPAT=252,
259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_TABLE_DEFAULT=253,
260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_TABLE_MAIN=254,
261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RT_TABLE_LOCAL=255,
262faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RT_TABLE_MAX=0xFFFFFFFF
263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Routing message attributes */
267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
2686cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum rtattr_type_t {
269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_UNSPEC,
270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_DST,
271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_SRC,
272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_IIF,
273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_OIF,
274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_GATEWAY,
275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PRIORITY,
276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PREFSRC,
277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_METRICS,
278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_MULTIPATH,
279faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_PROTOINFO, /* no longer used */
280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_FLOW,
281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_CACHEINFO,
282faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_SESSION, /* no longer used */
283faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_MP_ALGO, /* no longer used */
284faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_TABLE,
2856cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt	RTA_MARK,
286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__RTA_MAX
287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_MAX (__RTA_MAX - 1)
290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTM_MULTIPATH --- array of struct rtnexthop.
295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * "struct rtnexthop" describes all necessary nexthop information,
297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * i.e. parameters of path to a destination via this nexthop.
298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * At the moment it is impossible to set different prefsrc, mtu, window
300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and rtt for different paths from multipath.
301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
3036cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rtnexthop {
304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		rtnh_len;
305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtnh_flags;
306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtnh_hops;
307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int			rtnh_ifindex;
308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rtnh_flags */
311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Macros to handle hexthops */
317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_ALIGNTO	4
319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			   ((int)(rtnh)->rtnh_len) <= (len))
322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTM_CACHEINFO */
328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
3296cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rta_cacheinfo {
330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_clntref;
331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_lastuse;
332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__s32	rta_expires;
333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_error;
334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_used;
335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNETLINK_HAVE_PEERINFO 1
337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_id;
338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_ts;
339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	rta_tsage;
340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
3446cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum {
345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_UNSPEC,
346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_UNSPEC RTAX_UNSPEC
347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_LOCK,
348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_LOCK RTAX_LOCK
349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_MTU,
350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_MTU RTAX_MTU
351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_WINDOW,
352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_WINDOW RTAX_WINDOW
353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_RTT,
354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_RTT RTAX_RTT
355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_RTTVAR,
356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_RTTVAR RTAX_RTTVAR
357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_SSTHRESH,
358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_SSTHRESH RTAX_SSTHRESH
359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_CWND,
360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_CWND RTAX_CWND
361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_ADVMSS,
362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_ADVMSS RTAX_ADVMSS
363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_REORDERING,
364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_REORDERING RTAX_REORDERING
365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_HOPLIMIT,
366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_HOPLIMIT RTAX_HOPLIMIT
367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_INITCWND,
368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_INITCWND RTAX_INITCWND
369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTAX_FEATURES,
370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_FEATURES RTAX_FEATURES
371faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTAX_RTO_MIN,
372faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTAX_RTO_MIN RTAX_RTO_MIN
3736cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt	RTAX_INITRWND,
3746cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#define RTAX_INITRWND RTAX_INITRWND
375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__RTAX_MAX
376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_MAX (__RTAX_MAX - 1)
379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_FEATURE_ECN	0x00000001
381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_FEATURE_SACK	0x00000002
382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_FEATURE_TIMESTAMP	0x00000004
383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTAX_FEATURE_ALLFRAG	0x00000008
384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
3856cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rta_session {
386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	proto;
387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u8	pad1;
388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u16	pad2;
389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	union {
391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		struct {
392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			__u16	sport;
393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			__u16	dport;
394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		} ports;
395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		struct {
397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			__u8	type;
398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			__u8	code;
399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			__u16	ident;
400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		} icmpt;
401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		__u32		spi;
403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} u;
404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/****
407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		General form of address family dependent message.
408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4106cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct rtgenmsg {
411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char		rtgen_family;
412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*****************************************************************
415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		Link layer specific messages.
416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* struct ifinfomsg
419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * passes link level specific information, not dependent
420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * on network protocol.
421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4236cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct ifinfomsg {
424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	ifi_family;
425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	__ifi_pad;
426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	ifi_type;		/* ARPHRD_* */
427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int		ifi_index;		/* Link index	*/
428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned	ifi_flags;		/* IFF_* flags	*/
429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned	ifi_change;		/* IFF_* change mask */
430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/********************************************************************
433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		prefix information
434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4366cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct prefixmsg {
437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_family;
438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_pad1;
439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	prefix_pad2;
440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int		prefix_ifindex;
441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_type;
442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_len;
443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_flags;
444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	prefix_pad3;
445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum
448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	PREFIX_UNSPEC,
450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	PREFIX_ADDRESS,
451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	PREFIX_CACHEINFO,
452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__PREFIX_MAX
453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PREFIX_MAX	(__PREFIX_MAX - 1)
456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4576cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct prefix_cacheinfo {
458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	preferred_time;
459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32	valid_time;
460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*****************************************************************
464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		Traffic control messages.
465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ****/
466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4676cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct tcmsg {
468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	tcm_family;
469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	tcm__pad1;
470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	tcm__pad2;
471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int		tcm_ifindex;
472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		tcm_handle;
473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		tcm_parent;
474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		tcm_info;
475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4776cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum {
478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_UNSPEC,
479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_KIND,
480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_OPTIONS,
481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_STATS,
482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_XSTATS,
483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_RATE,
484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_FCNT,
485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	TCA_STATS2,
486faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	TCA_STAB,
487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__TCA_MAX
488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TCA_MAX (__TCA_MAX - 1)
491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
495faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat/********************************************************************
496faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat *		Neighbor Discovery userland options
497faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat ****/
498faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
4996cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct nduseroptmsg {
500faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	unsigned char	nduseropt_family;
501faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	unsigned char	nduseropt_pad1;
502faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	unsigned short	nduseropt_opts_len;	/* Total length of options */
503faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	int		nduseropt_ifindex;
504faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	__u8		nduseropt_icmp_type;
505faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	__u8		nduseropt_icmp_code;
506faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	unsigned short	nduseropt_pad2;
507faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	unsigned int	nduseropt_pad3;
508faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	/* Followed by one or more ND options */
509faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat};
510faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
5116cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtenum {
512faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	NDUSEROPT_UNSPEC,
513faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	NDUSEROPT_SRCADDR,
514faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	__NDUSEROPT_MAX
515faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat};
516faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
517faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
518faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __KERNEL__
520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTnetlink multicast groups - backwards compatibility for userspace */
521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_LINK		1
522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_NOTIFY		2
523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_NEIGH		4
524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_TC		8
525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV4_IFADDR	0x10
527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV4_MROUTE	0x20
528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV4_ROUTE	0x40
529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV4_RULE	0x80
530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV6_IFADDR	0x100
532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV6_MROUTE	0x200
533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV6_ROUTE	0x400
534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV6_IFINFO	0x800
535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_DECnet_IFADDR    0x1000
537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_DECnet_ROUTE     0x4000
538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTMGRP_IPV6_PREFIX	0x20000
540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTnetlink multicast groups */
543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum rtnetlink_groups {
544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_NONE,
545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_NONE		RTNLGRP_NONE
546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_LINK,
547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_LINK		RTNLGRP_LINK
548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_NOTIFY,
549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_NEIGH,
551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_NEIGH		RTNLGRP_NEIGH
552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_TC,
553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_TC		RTNLGRP_TC
554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV4_IFADDR,
555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV4_MROUTE,
557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV4_ROUTE,
559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV4_RULE,
561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV6_IFADDR,
563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV6_MROUTE,
565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV6_ROUTE,
567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV6_IFINFO,
569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_DECnet_IFADDR,
571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_NOP2,
573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_DECnet_ROUTE,
574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
575faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTNLGRP_DECnet_RULE,
576faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_NOP4,
578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTNLGRP_IPV6_PREFIX,
579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
580faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTNLGRP_IPV6_RULE,
581faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
582faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTNLGRP_ND_USEROPT,
583faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
584faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTNLGRP_PHONET_IFADDR,
585faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
586faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTNLGRP_PHONET_ROUTE,
587faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__RTNLGRP_MAX
589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
591c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
592c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* TC action piece */
5936cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtstruct tcamsg {
594c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	tca_family;
595c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned char	tca__pad1;
596c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short	tca__pad2;
597c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
598c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
599c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
600c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TCA_ACT_TAB 1 /* attr type must be >=1 */
601c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TCAA_MAX 1
602c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
603c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* End of information exported to user level */
604c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
605c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
606c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
607c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mutex.h>
608c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
609c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
610c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
611c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int len = strlen(str) + 1;
612c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);
613c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
614c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
615faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, u32 group, int echo);
616faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid);
617faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid,
618faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat			u32 group, struct nlmsghdr *nlh, gfp_t flags);
619faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern void rtnl_set_sk_err(struct net *net, u32 group, int error);
620c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
621faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst,
622faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat			      u32 id, u32 ts, u32 tsage, long expires,
623faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat			      u32 error);
624c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
625c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
626c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
627c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT(skb, attrtype, attrlen, data) \
628c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
629c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		 goto rtattr_failure; \
630c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   	__rta_fill(skb, attrtype, attrlen, data); })
631c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
632c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_APPEND(skb, attrlen, data) \
633c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \
634c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
635c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	memcpy(skb_put(skb, attrlen), data, attrlen); })
636c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
637c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_NOHDR(skb, attrlen, data) \
638c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \
639faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	memset(skb_tail_pointer(skb) - (RTA_ALIGN(attrlen) - attrlen), 0, \
640c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	       RTA_ALIGN(attrlen) - attrlen); })
641c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
642c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_U8(skb, attrtype, value) \
643c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	u8 _tmp = (value); \
644c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); })
645c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
646c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_U16(skb, attrtype, value) \
647c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	u16 _tmp = (value); \
648c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); })
649c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
650c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_U32(skb, attrtype, value) \
651c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	u32 _tmp = (value); \
652c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); })
653c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
654c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_U64(skb, attrtype, value) \
655c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	u64 _tmp = (value); \
656c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); })
657c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
658c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_SECS(skb, attrtype, value) \
659c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT_U64(skb, attrtype, (value) / HZ)
660c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
661c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_MSECS(skb, attrtype, value) \
662c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value))
663c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
664c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_STRING(skb, attrtype, value) \
665c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, strlen(value) + 1, value)
666c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
667c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_PUT_FLAG(skb, attrtype) \
668c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, attrtype, 0, NULL);
669c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
670c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_NEST(skb, type) \
671faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat({	struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
672c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	RTA_PUT(skb, type, 0, NULL); \
673c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__start;  })
674c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
675c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_NEST_END(skb, start) \
676faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat({	(start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
677faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	(skb)->len; })
678faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
679faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTA_NEST_COMPAT(skb, type, attrlen, data) \
680faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat({	struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
681faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_PUT(skb, type, attrlen, data); \
682faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_NEST(skb, type); \
683faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	__start; })
684faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat
685faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat#define RTA_NEST_COMPAT_END(skb, start) \
686faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat({	struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
687faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	(start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
688faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	RTA_NEST_END(skb, __nest); \
689c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	(skb)->len; })
690c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
691c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_NEST_CANCEL(skb, start) \
692c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (start) \
693c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
694c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	-1; })
695c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
696c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_U8(rta) \
697c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \
698c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
699c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*(u8 *) RTA_DATA(rta); })
700c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
701c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_U16(rta) \
702c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \
703c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
704c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*(u16 *) RTA_DATA(rta); })
705c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
706c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_U32(rta) \
707c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \
708c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
709c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*(u32 *) RTA_DATA(rta); })
710c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
711c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_U64(rta) \
712c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({	u64 _tmp; \
713c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \
714c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
715c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \
716c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	_tmp; })
717c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
718c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_FLAG(rta) (!!(rta))
719c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
720c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ)
721c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta)))
722c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
723c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct rtattr *
724c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__rta_reserve(struct sk_buff *skb, int attrtype, int attrlen)
725c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
726c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct rtattr *rta;
727c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int size = RTA_LENGTH(attrlen);
728c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
729c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	rta = (struct rtattr*)skb_put(skb, RTA_ALIGN(size));
730c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	rta->rta_type = attrtype;
731c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	rta->rta_len = size;
732c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size);
733c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return rta;
734c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
735c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
736c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __RTA_PUT(skb, attrtype, attrlen) \
737c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ 	if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
738c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		goto rtattr_failure; \
739c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   	__rta_reserve(skb, attrtype, attrlen); })
740c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
741c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
742c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
743c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* RTNL is used as a global lock for all changes to network configuration  */
744c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void rtnl_lock(void);
745c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void rtnl_unlock(void);
746c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int rtnl_trylock(void);
747faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatextern int rtnl_is_locked(void);
7486cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#ifdef CONFIG_PROVE_LOCKING
7496cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidtextern int lockdep_rtnl_is_held(void);
7506cc0d5c38d97a1f3f8144227a4e8ec18c2353690Dmitry Shmidt#endif /* #ifdef CONFIG_PROVE_LOCKING */
751c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
752c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void rtnetlink_init(void);
753c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __rtnl_unlock(void);
754c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
755c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ASSERT_RTNL() do { \
756faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	if (unlikely(!rtnl_is_locked())) { \
757c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
758c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		       __FILE__,  __LINE__); \
759c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		dump_stack(); \
760c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} \
761c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while(0)
762c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
763faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatstatic inline u32 rtm_get_table(struct rtattr **rta, u8 table)
764faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat{
765faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	return RTA_GET_U32(rta[RTA_TABLE-1]);
766faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehatrtattr_failure:
767faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat	return table;
768faeff4e8918c60eb0840f42f0d34efa7fe69db9aSan Mehat}
769c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
770c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */
771c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
772c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
773c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif	/* __LINUX_RTNETLINK_H */
774