| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * INET		An implementation of the TCP/IP protocol suite for the LINUX | 
|  | 3 | *		operating system.  INET  is implemented using the  BSD Socket | 
|  | 4 | *		interface as the means of communication with the user level. | 
|  | 5 | * | 
|  | 6 | *		Definitions for the IP router. | 
|  | 7 | * | 
|  | 8 | * Version:	@(#)route.h	1.0.4	05/27/93 | 
|  | 9 | * | 
| Jesper Juhl | 02c30a8 | 2005-05-05 16:16:16 -0700 | [diff] [blame] | 10 | * Authors:	Ross Biro | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> | 
|  | 12 | * Fixes: | 
|  | 13 | *		Alan Cox	:	Reformatted. Added ip_rt_local() | 
|  | 14 | *		Alan Cox	:	Support for TCP parameters. | 
|  | 15 | *		Alexey Kuznetsov:	Major changes for new routing code. | 
|  | 16 | *		Mike McLagan    :	Routing by source | 
|  | 17 | *		Robert Olsson   :	Added rt_cache statistics | 
|  | 18 | * | 
|  | 19 | *		This program is free software; you can redistribute it and/or | 
|  | 20 | *		modify it under the terms of the GNU General Public License | 
|  | 21 | *		as published by the Free Software Foundation; either version | 
|  | 22 | *		2 of the License, or (at your option) any later version. | 
|  | 23 | */ | 
|  | 24 | #ifndef _ROUTE_H | 
|  | 25 | #define _ROUTE_H | 
|  | 26 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | #include <net/dst.h> | 
|  | 28 | #include <net/inetpeer.h> | 
|  | 29 | #include <net/flow.h> | 
|  | 30 | #include <linux/in_route.h> | 
|  | 31 | #include <linux/rtnetlink.h> | 
|  | 32 | #include <linux/route.h> | 
|  | 33 | #include <linux/ip.h> | 
|  | 34 | #include <linux/cache.h> | 
| Venkat Yekkirala | beb8d13 | 2006-08-04 23:12:42 -0700 | [diff] [blame] | 35 | #include <linux/security.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 |  | 
|  | 37 | #ifndef __KERNEL__ | 
|  | 38 | #warning This file is not supposed to be used outside of kernel. | 
|  | 39 | #endif | 
|  | 40 |  | 
|  | 41 | #define RTO_ONLINK	0x01 | 
|  | 42 |  | 
|  | 43 | #define RTO_CONN	0 | 
|  | 44 | /* RTO_CONN is not used (being alias for 0), but preserved not to break | 
|  | 45 | * some modules referring to it. */ | 
|  | 46 |  | 
|  | 47 | #define RT_CONN_FLAGS(sk)   (RT_TOS(inet_sk(sk)->tos) | sock_flag(sk, SOCK_LOCALROUTE)) | 
|  | 48 |  | 
|  | 49 | struct fib_nh; | 
|  | 50 | struct inet_peer; | 
|  | 51 | struct rtable | 
|  | 52 | { | 
|  | 53 | union | 
|  | 54 | { | 
|  | 55 | struct dst_entry	dst; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 56 | } u; | 
|  | 57 |  | 
| Eric Dumazet | 093c2ca | 2007-02-09 16:19:26 -0800 | [diff] [blame] | 58 | /* Cache lookup keys */ | 
|  | 59 | struct flowi		fl; | 
|  | 60 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | struct in_device	*idev; | 
|  | 62 |  | 
|  | 63 | unsigned		rt_flags; | 
|  | 64 | __u16			rt_type; | 
|  | 65 | __u16			rt_multipath_alg; | 
|  | 66 |  | 
| Al Viro | f2c3fe2 | 2006-09-26 21:26:42 -0700 | [diff] [blame] | 67 | __be32			rt_dst;	/* Path destination	*/ | 
|  | 68 | __be32			rt_src;	/* Path source		*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 | int			rt_iif; | 
|  | 70 |  | 
|  | 71 | /* Info on neighbour */ | 
| Al Viro | f2c3fe2 | 2006-09-26 21:26:42 -0700 | [diff] [blame] | 72 | __be32			rt_gateway; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 74 | /* Miscellaneous cached information */ | 
| Al Viro | f2c3fe2 | 2006-09-26 21:26:42 -0700 | [diff] [blame] | 75 | __be32			rt_spec_dst; /* RFC1122 specific destination */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 76 | struct inet_peer	*peer; /* long-living peer info */ | 
|  | 77 | }; | 
|  | 78 |  | 
|  | 79 | struct ip_rt_acct | 
|  | 80 | { | 
|  | 81 | __u32 	o_bytes; | 
|  | 82 | __u32 	o_packets; | 
|  | 83 | __u32 	i_bytes; | 
|  | 84 | __u32 	i_packets; | 
|  | 85 | }; | 
|  | 86 |  | 
|  | 87 | struct rt_cache_stat | 
|  | 88 | { | 
|  | 89 | unsigned int in_hit; | 
|  | 90 | unsigned int in_slow_tot; | 
|  | 91 | unsigned int in_slow_mc; | 
|  | 92 | unsigned int in_no_route; | 
|  | 93 | unsigned int in_brd; | 
|  | 94 | unsigned int in_martian_dst; | 
|  | 95 | unsigned int in_martian_src; | 
|  | 96 | unsigned int out_hit; | 
|  | 97 | unsigned int out_slow_tot; | 
|  | 98 | unsigned int out_slow_mc; | 
|  | 99 | unsigned int gc_total; | 
|  | 100 | unsigned int gc_ignored; | 
|  | 101 | unsigned int gc_goal_miss; | 
|  | 102 | unsigned int gc_dst_overflow; | 
|  | 103 | unsigned int in_hlist_search; | 
|  | 104 | unsigned int out_hlist_search; | 
|  | 105 | }; | 
|  | 106 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 | extern struct ip_rt_acct *ip_rt_acct; | 
|  | 108 |  | 
|  | 109 | struct in_device; | 
|  | 110 | extern int		ip_rt_init(void); | 
| Al Viro | f765522 | 2006-09-26 21:25:43 -0700 | [diff] [blame] | 111 | extern void		ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw, | 
|  | 112 | __be32 src, struct net_device *dev); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 113 | extern void		ip_rt_advice(struct rtable **rp, int advice); | 
|  | 114 | extern void		rt_cache_flush(int how); | 
|  | 115 | extern int		__ip_route_output_key(struct rtable **, const struct flowi *flp); | 
|  | 116 | extern int		ip_route_output_key(struct rtable **, struct flowi *flp); | 
|  | 117 | extern int		ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); | 
| Al Viro | 9e12bb2 | 2006-09-26 21:25:20 -0700 | [diff] [blame] | 118 | extern int		ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 119 | extern unsigned short	ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu); | 
|  | 120 | extern void		ip_rt_send_redirect(struct sk_buff *skb); | 
|  | 121 |  | 
| Al Viro | fd68322 | 2006-09-26 22:17:51 -0700 | [diff] [blame] | 122 | extern unsigned		inet_addr_type(__be32 addr); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 123 | extern void		ip_rt_multicast_event(struct in_device *); | 
|  | 124 | extern int		ip_rt_ioctl(unsigned int cmd, void __user *arg); | 
|  | 125 | extern void		ip_rt_get_source(u8 *src, struct rtable *rt); | 
|  | 126 | extern int		ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb); | 
|  | 127 |  | 
| Jamal Hadi Salim | 0ff60a4 | 2005-11-22 14:47:37 -0800 | [diff] [blame] | 128 | struct in_ifaddr; | 
|  | 129 | extern void fib_add_ifaddr(struct in_ifaddr *); | 
|  | 130 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 131 | static inline void ip_rt_put(struct rtable * rt) | 
|  | 132 | { | 
|  | 133 | if (rt) | 
|  | 134 | dst_release(&rt->u.dst); | 
|  | 135 | } | 
|  | 136 |  | 
|  | 137 | #define IPTOS_RT_MASK	(IPTOS_TOS_MASK & ~3) | 
|  | 138 |  | 
|  | 139 | extern __u8 ip_tos2prio[16]; | 
|  | 140 |  | 
|  | 141 | static inline char rt_tos2priority(u8 tos) | 
|  | 142 | { | 
|  | 143 | return ip_tos2prio[IPTOS_TOS(tos)>>1]; | 
|  | 144 | } | 
|  | 145 |  | 
| Al Viro | bada8ad | 2006-09-26 21:27:15 -0700 | [diff] [blame] | 146 | static inline int ip_route_connect(struct rtable **rp, __be32 dst, | 
|  | 147 | __be32 src, u32 tos, int oif, u8 protocol, | 
| David S. Miller | 8eb9086 | 2007-02-08 02:09:21 -0800 | [diff] [blame] | 148 | __be16 sport, __be16 dport, struct sock *sk, | 
|  | 149 | int flags) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 150 | { | 
|  | 151 | struct flowi fl = { .oif = oif, | 
|  | 152 | .nl_u = { .ip4_u = { .daddr = dst, | 
|  | 153 | .saddr = src, | 
|  | 154 | .tos   = tos } }, | 
|  | 155 | .proto = protocol, | 
|  | 156 | .uli_u = { .ports = | 
|  | 157 | { .sport = sport, | 
|  | 158 | .dport = dport } } }; | 
|  | 159 |  | 
|  | 160 | int err; | 
|  | 161 | if (!dst || !src) { | 
|  | 162 | err = __ip_route_output_key(rp, &fl); | 
|  | 163 | if (err) | 
|  | 164 | return err; | 
|  | 165 | fl.fl4_dst = (*rp)->rt_dst; | 
|  | 166 | fl.fl4_src = (*rp)->rt_src; | 
|  | 167 | ip_rt_put(*rp); | 
|  | 168 | *rp = NULL; | 
|  | 169 | } | 
| Venkat Yekkirala | beb8d13 | 2006-08-04 23:12:42 -0700 | [diff] [blame] | 170 | security_sk_classify_flow(sk, &fl); | 
| David S. Miller | 8eb9086 | 2007-02-08 02:09:21 -0800 | [diff] [blame] | 171 | return ip_route_output_flow(rp, &fl, sk, flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 172 | } | 
|  | 173 |  | 
| Patrick McHardy | 5d39a79 | 2006-01-31 17:35:35 -0800 | [diff] [blame] | 174 | static inline int ip_route_newports(struct rtable **rp, u8 protocol, | 
| Al Viro | 39dccd9 | 2006-09-27 18:34:41 -0700 | [diff] [blame] | 175 | __be16 sport, __be16 dport, struct sock *sk) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 176 | { | 
|  | 177 | if (sport != (*rp)->fl.fl_ip_sport || | 
|  | 178 | dport != (*rp)->fl.fl_ip_dport) { | 
|  | 179 | struct flowi fl; | 
|  | 180 |  | 
|  | 181 | memcpy(&fl, &(*rp)->fl, sizeof(fl)); | 
|  | 182 | fl.fl_ip_sport = sport; | 
|  | 183 | fl.fl_ip_dport = dport; | 
| Patrick McHardy | 5d39a79 | 2006-01-31 17:35:35 -0800 | [diff] [blame] | 184 | fl.proto = protocol; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 185 | ip_rt_put(*rp); | 
|  | 186 | *rp = NULL; | 
| Venkat Yekkirala | beb8d13 | 2006-08-04 23:12:42 -0700 | [diff] [blame] | 187 | security_sk_classify_flow(sk, &fl); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 188 | return ip_route_output_flow(rp, &fl, sk, 0); | 
|  | 189 | } | 
|  | 190 | return 0; | 
|  | 191 | } | 
|  | 192 |  | 
|  | 193 | extern void rt_bind_peer(struct rtable *rt, int create); | 
|  | 194 |  | 
|  | 195 | static inline struct inet_peer *rt_get_peer(struct rtable *rt) | 
|  | 196 | { | 
|  | 197 | if (rt->peer) | 
|  | 198 | return rt->peer; | 
|  | 199 |  | 
|  | 200 | rt_bind_peer(rt, 0); | 
|  | 201 | return rt->peer; | 
|  | 202 | } | 
|  | 203 |  | 
| Arnaldo Carvalho de Melo | 2038073 | 2005-08-16 02:18:02 -0300 | [diff] [blame] | 204 | extern ctl_table ipv4_route_table[]; | 
|  | 205 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 206 | #endif	/* _ROUTE_H */ |