summaryrefslogtreecommitdiffstats
path: root/include/linux/route.h
blob: 4432d190052540fa33042d4fa6be88c99e00584c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/*
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		Global definitions for the IP router interface.
 *
 * Version:	@(#)route.h	1.0.3	05/27/93
 *
 * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988
 *		for the purposes of compatibility only.
 *
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 */
#ifndef _LINUX_ROUTE_H
#define _LINUX_ROUTE_H

#include <linux/if.h>


/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
struct rtentry 
{
	unsigned long	rt_pad1;
	struct sockaddr	rt_dst;		/* target address		*/
	struct sockaddr	rt_gateway;	/* gateway addr (RTF_GATEWAY)	*/
	struct sockaddr	rt_genmask;	/* target network mask (IP)	*/
	unsigned short	rt_flags;
	short		rt_pad2;
	unsigned long	rt_pad3;
	unsigned char	rt_tos;
	unsigned char	rt_class;
	short		rt_pad4;
	short		rt_metric;	/* +1 for binary compatibility!	*/
	char		*rt_dev;	/* forcing the device at add	*/
	unsigned long	rt_mtu;		/* per route MTU/Window 	*/
#ifndef __KERNEL__
#define rt_mss	rt_mtu			/* Compatibility :-(            */
#endif
	unsigned long	rt_window;	/* Window clamping 		*/
	unsigned short	rt_irtt;	/* Initial RTT			*/
	
};


#define	RTF_UP		0x0001		/* route usable		  	*/
#define	RTF_GATEWAY	0x0002		/* destination is a gateway	*/

#define	RTF_HOST	0x0004		/* host entry (net otherwise)	*/
#define RTF_REINSTATE	0x0008		/* reinstate route after tmout	*/
#define	RTF_DYNAMIC	0x0010		/* created dyn. (by redirect)	*/
#define	RTF_MODIFIED	0x0020		/* modified dyn. (by redirect)	*/
#define RTF_MTU		0x0040		/* specific MTU for this route	*/
#define RTF_MSS		RTF_MTU		/* Compatibility :-(		*/
#define RTF_WINDOW	0x0080		/* per route window clamping	*/
#define RTF_IRTT	0x0100		/* Initial round trip time	*/
#define RTF_REJECT	0x0200		/* Reject route			*/
#define	RTF_STATIC	0x0400		/* Manually injected route	*/
#define	RTF_XRESOLVE	0x0800		/* External resolver		*/
#define RTF_NOFORWARD   0x1000		/* Forwarding inhibited		*/
#define RTF_THROW	0x2000		/* Go to next class		*/
#define RTF_NOPMTUDISC  0x4000		/* Do not send packets with DF	*/

#define RTF_MAGIC	0x8000		/* Route added/deleted authomatically,
					 * when interface changes its state.
					 */

/*
 *	<linux/ipv6_route.h> uses RTF values >= 64k
 */

#define RTCF_VALVE	0x00200000
#define RTCF_MASQ	0x00400000
#define RTCF_NAT	0x00800000
#define RTCF_DOREDIRECT 0x01000000
#define RTCF_LOG	0x02000000
#define RTCF_DIRECTSRC	0x04000000

#define RTF_LOCAL	0x80000000
#define RTF_INTERFACE	0x40000000
#define RTF_MULTICAST	0x20000000
#define RTF_BROADCAST	0x10000000
#define RTF_NAT		0x08000000

#define RTF_ADDRCLASSMASK	0xF8000000
#define RT_ADDRCLASS(flags)	((__u32)flags>>23)

#define RT_TOS(tos)		((tos)&IPTOS_TOS_MASK)

#define RT_LOCALADDR(flags)	((flags&RTF_ADDRCLASSMASK) == (RTF_LOCAL|RTF_INTERFACE))

#define RT_CLASS_UNSPEC		0
#define RT_CLASS_DEFAULT	253

#define RT_CLASS_MAIN		254
#define RT_CLASS_LOCAL		255
#define RT_CLASS_MAX		255

#ifdef _LINUX_IN_H 	/* hack to check that in.h included */
/*
 *	This structure is passed from the kernel to user space by netlink
 *	routing/device announcements
 */

struct in_rtmsg
{
	struct in_addr	rtmsg_prefix;
	struct in_addr	rtmsg_gateway;
	unsigned	rtmsg_flags;
	unsigned long	rtmsg_mtu;
	unsigned long	rtmsg_window;
	unsigned short	rtmsg_rtt;
	short		rtmsg_metric;
	unsigned char	rtmsg_tos;
	unsigned char	rtmsg_class;
	unsigned char	rtmsg_prefixlen;
	unsigned char	rtmsg_reserved;
	int		rtmsg_ifindex;
};


struct in_ifmsg
{
	struct sockaddr ifmsg_lladdr;
	struct in_addr	ifmsg_prefix;
	struct in_addr	ifmsg_brd;
	unsigned	ifmsg_flags;
	unsigned long	ifmsg_mtu;
	short		ifmsg_metric;
	unsigned char	ifmsg_prefixlen;
	unsigned char	ifmsg_reserved;
	int		ifmsg_index;
	char		ifmsg_name[16];
};

enum rtrule_actions
{
	RTP_GO,
	RTP_NAT,
	RTP_DROP,
	RTP_UNREACHABLE,
	RTP_PROHIBIT,
	RTP_MASQUERADE
};

#define RTRF_LOG		1	/* Log route creations		*/
#define RTRF_VALVE		2	/* One-way route		*/

struct in_rtrulemsg
{
	struct in_addr	rtrmsg_src;
	struct in_addr	rtrmsg_dst;
	struct in_addr	rtrmsg_srcmap;
	int		rtrmsg_ifindex;
	unsigned char	rtrmsg_srclen;
	unsigned char	rtrmsg_dstlen;
	unsigned char	rtrmsg_tos;
	unsigned char	rtrmsg_class;
	unsigned char	rtrmsg_flags;
	unsigned char	rtrmsg_action;
	unsigned char	rtrmsg_preference;
	unsigned char	rtrmsg_rtmsgs;
	struct in_rtmsg rtrmsg_rtmsg[1];
};

struct in_rtctlmsg
{
        unsigned	rtcmsg_flags;
        int		rtcmsg_delay;
};

#define RTCTL_ECHO	1	/* Echo route changes */
#define RTCTL_FLUSH	2	/* Send flush updates */
#define RTCTL_ACK	4	/* Send acks	      */
#define RTCTL_DELAY	8	/* Set netlink delay  */
#define RTCTL_OWNER	0x10	/* Set netlink reader */
#endif

#define RTMSG_ACK		NLMSG_ACK
#define RTMSG_OVERRUN		NLMSG_OVERRUN

#define RTMSG_NEWDEVICE		0x11
#define RTMSG_DELDEVICE		0x12
#define RTMSG_NEWROUTE		0x21
#define RTMSG_DELROUTE		0x22
#define RTMSG_NEWRULE		0x31
#define RTMSG_DELRULE		0x32
#define RTMSG_CONTROL		0x40

#define RTMSG_AR_FAILED		0x51	/* Address Resolution failed	*/
#endif	/* _LINUX_ROUTE_H */