route.h 5.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 * 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.
 *
 *		Definitions for the IP router.
 *
 * Version:	@(#)route.h	1.0.4	05/27/93
 *
10
 * Authors:	Ross Biro
L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 * Fixes:
 *		Alan Cox	:	Reformatted. Added ip_rt_local()
 *		Alan Cox	:	Support for TCP parameters.
 *		Alexey Kuznetsov:	Major changes for new routing code.
 *		Mike McLagan    :	Routing by source
 *		Robert Olsson   :	Added rt_cache statistics
 *
 *		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 _ROUTE_H
#define _ROUTE_H

#include <net/dst.h>
#include <net/inetpeer.h>
#include <net/flow.h>
#include <linux/in_route.h>
#include <linux/rtnetlink.h>
#include <linux/route.h>
#include <linux/ip.h>
#include <linux/cache.h>
V
Venkat Yekkirala 已提交
35
#include <linux/security.h>
L
Linus Torvalds 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

#ifndef __KERNEL__
#warning This file is not supposed to be used outside of kernel.
#endif

#define RTO_ONLINK	0x01

#define RTO_CONN	0
/* RTO_CONN is not used (being alias for 0), but preserved not to break
 * some modules referring to it. */

#define RT_CONN_FLAGS(sk)   (RT_TOS(inet_sk(sk)->tos) | sock_flag(sk, SOCK_LOCALROUTE))

struct fib_nh;
struct inet_peer;
struct rtable
{
	union
	{
		struct dst_entry	dst;
	} u;

58 59 60
	/* Cache lookup keys */
	struct flowi		fl;

L
Linus Torvalds 已提交
61 62 63 64 65
	struct in_device	*idev;
	
	unsigned		rt_flags;
	__u16			rt_type;

66 67
	__be32			rt_dst;	/* Path destination	*/
	__be32			rt_src;	/* Path source		*/
L
Linus Torvalds 已提交
68 69 70
	int			rt_iif;

	/* Info on neighbour */
71
	__be32			rt_gateway;
L
Linus Torvalds 已提交
72 73

	/* Miscellaneous cached information */
74
	__be32			rt_spec_dst; /* RFC1122 specific destination */
L
Linus Torvalds 已提交
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
	struct inet_peer	*peer; /* long-living peer info */
};

struct ip_rt_acct
{
	__u32 	o_bytes;
	__u32 	o_packets;
	__u32 	i_bytes;
	__u32 	i_packets;
};

struct rt_cache_stat 
{
        unsigned int in_hit;
        unsigned int in_slow_tot;
        unsigned int in_slow_mc;
        unsigned int in_no_route;
        unsigned int in_brd;
        unsigned int in_martian_dst;
        unsigned int in_martian_src;
        unsigned int out_hit;
        unsigned int out_slow_tot;
        unsigned int out_slow_mc;
        unsigned int gc_total;
        unsigned int gc_ignored;
        unsigned int gc_goal_miss;
        unsigned int gc_dst_overflow;
        unsigned int in_hlist_search;
        unsigned int out_hlist_search;
};

extern struct ip_rt_acct *ip_rt_acct;

struct in_device;
extern int		ip_rt_init(void);
A
Al Viro 已提交
110 111
extern void		ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
				       __be32 src, struct net_device *dev);
L
Linus Torvalds 已提交
112
extern void		rt_cache_flush(int how);
113
extern int		__ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp);
L
Linus Torvalds 已提交
114
extern int		ip_route_output_key(struct rtable **, struct flowi *flp);
115
extern int		ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags);
A
Al Viro 已提交
116
extern int		ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin);
L
Linus Torvalds 已提交
117 118 119
extern unsigned short	ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu);
extern void		ip_rt_send_redirect(struct sk_buff *skb);

120 121
extern unsigned		inet_addr_type(struct net *net, __be32 addr);
extern unsigned		inet_dev_addr_type(struct net *net, const struct net_device *dev, __be32 addr);
L
Linus Torvalds 已提交
122
extern void		ip_rt_multicast_event(struct in_device *);
123
extern int		ip_rt_ioctl(struct net *, unsigned int cmd, void __user *arg);
L
Linus Torvalds 已提交
124 125 126
extern void		ip_rt_get_source(u8 *src, struct rtable *rt);
extern int		ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb);

127 128 129
struct in_ifaddr;
extern void fib_add_ifaddr(struct in_ifaddr *);

L
Linus Torvalds 已提交
130 131 132 133 134 135 136 137
static inline void ip_rt_put(struct rtable * rt)
{
	if (rt)
		dst_release(&rt->u.dst);
}

#define IPTOS_RT_MASK	(IPTOS_TOS_MASK & ~3)

138
extern const __u8 ip_tos2prio[16];
L
Linus Torvalds 已提交
139 140 141 142 143 144

static inline char rt_tos2priority(u8 tos)
{
	return ip_tos2prio[IPTOS_TOS(tos)>>1];
}

145 146
static inline int ip_route_connect(struct rtable **rp, __be32 dst,
				   __be32 src, u32 tos, int oif, u8 protocol,
147 148
				   __be16 sport, __be16 dport, struct sock *sk,
				   int flags)
L
Linus Torvalds 已提交
149 150 151 152 153 154 155 156 157 158 159 160
{
	struct flowi fl = { .oif = oif,
			    .nl_u = { .ip4_u = { .daddr = dst,
						 .saddr = src,
						 .tos   = tos } },
			    .proto = protocol,
			    .uli_u = { .ports =
				       { .sport = sport,
					 .dport = dport } } };

	int err;
	if (!dst || !src) {
161
		err = __ip_route_output_key(&init_net, rp, &fl);
L
Linus Torvalds 已提交
162 163 164 165 166 167 168
		if (err)
			return err;
		fl.fl4_dst = (*rp)->rt_dst;
		fl.fl4_src = (*rp)->rt_src;
		ip_rt_put(*rp);
		*rp = NULL;
	}
V
Venkat Yekkirala 已提交
169
	security_sk_classify_flow(sk, &fl);
170
	return ip_route_output_flow(&init_net, rp, &fl, sk, flags);
L
Linus Torvalds 已提交
171 172
}

173
static inline int ip_route_newports(struct rtable **rp, u8 protocol,
A
Al Viro 已提交
174
				    __be16 sport, __be16 dport, struct sock *sk)
L
Linus Torvalds 已提交
175 176 177 178 179 180 181 182
{
	if (sport != (*rp)->fl.fl_ip_sport ||
	    dport != (*rp)->fl.fl_ip_dport) {
		struct flowi fl;

		memcpy(&fl, &(*rp)->fl, sizeof(fl));
		fl.fl_ip_sport = sport;
		fl.fl_ip_dport = dport;
183
		fl.proto = protocol;
L
Linus Torvalds 已提交
184 185
		ip_rt_put(*rp);
		*rp = NULL;
V
Venkat Yekkirala 已提交
186
		security_sk_classify_flow(sk, &fl);
187
		return ip_route_output_flow(&init_net, rp, &fl, sk, 0);
L
Linus Torvalds 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
	}
	return 0;
}

extern void rt_bind_peer(struct rtable *rt, int create);

static inline struct inet_peer *rt_get_peer(struct rtable *rt)
{
	if (rt->peer)
		return rt->peer;

	rt_bind_peer(rt, 0);
	return rt->peer;
}

203 204
extern ctl_table ipv4_route_table[];

L
Linus Torvalds 已提交
205
#endif	/* _ROUTE_H */