2005-04-17 02:20:36 +04:00
/*
* 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
*
2005-05-06 03:16:16 +04:00
* Authors : Ross Biro
2005-04-17 02:20:36 +04:00
* 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>
2006-08-05 10:12:42 +04:00
# include <linux/security.h>
2005-04-17 02:20:36 +04:00
# 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 ;
2007-02-10 03:19:26 +03:00
/* Cache lookup keys */
struct flowi fl ;
2005-04-17 02:20:36 +04:00
struct in_device * idev ;
unsigned rt_flags ;
__u16 rt_type ;
2006-09-27 08:26:42 +04:00
__be32 rt_dst ; /* Path destination */
__be32 rt_src ; /* Path source */
2005-04-17 02:20:36 +04:00
int rt_iif ;
/* Info on neighbour */
2006-09-27 08:26:42 +04:00
__be32 rt_gateway ;
2005-04-17 02:20:36 +04:00
/* Miscellaneous cached information */
2006-09-27 08:26:42 +04:00
__be32 rt_spec_dst ; /* RFC1122 specific destination */
2005-04-17 02:20:36 +04:00
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 ) ;
2006-09-27 08:25:43 +04:00
extern void ip_rt_redirect ( __be32 old_gw , __be32 dst , __be32 new_gw ,
__be32 src , struct net_device * dev ) ;
2005-04-17 02:20:36 +04:00
extern void rt_cache_flush ( int how ) ;
2008-01-23 09:06:48 +03:00
extern int __ip_route_output_key ( struct net * , struct rtable * * , const struct flowi * flp ) ;
2008-01-23 09:07:34 +03:00
extern int ip_route_output_key ( struct net * , struct rtable * * , struct flowi * flp ) ;
2008-01-23 09:07:10 +03:00
extern int ip_route_output_flow ( struct net * , struct rtable * * rp , struct flowi * flp , struct sock * sk , int flags ) ;
2006-09-27 08:25:20 +04:00
extern int ip_route_input ( struct sk_buff * , __be32 dst , __be32 src , u8 tos , struct net_device * devin ) ;
2005-04-17 02:20:36 +04:00
extern unsigned short ip_rt_frag_needed ( struct iphdr * iph , unsigned short new_mtu ) ;
extern void ip_rt_send_redirect ( struct sk_buff * skb ) ;
2008-01-10 14:25:28 +03:00
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 ) ;
2005-04-17 02:20:36 +04:00
extern void ip_rt_multicast_event ( struct in_device * ) ;
2008-01-10 14:29:53 +03:00
extern int ip_rt_ioctl ( struct net * , unsigned int cmd , void __user * arg ) ;
2005-04-17 02:20:36 +04:00
extern void ip_rt_get_source ( u8 * src , struct rtable * rt ) ;
extern int ip_rt_dump ( struct sk_buff * skb , struct netlink_callback * cb ) ;
2005-11-23 01:47:37 +03:00
struct in_ifaddr ;
extern void fib_add_ifaddr ( struct in_ifaddr * ) ;
2005-04-17 02:20:36 +04:00
static inline void ip_rt_put ( struct rtable * rt )
{
if ( rt )
dst_release ( & rt - > u . dst ) ;
}
# define IPTOS_RT_MASK (IPTOS_TOS_MASK & ~3)
2007-07-10 02:32:57 +04:00
extern const __u8 ip_tos2prio [ 16 ] ;
2005-04-17 02:20:36 +04:00
static inline char rt_tos2priority ( u8 tos )
{
return ip_tos2prio [ IPTOS_TOS ( tos ) > > 1 ] ;
}
2006-09-27 08:27:15 +04:00
static inline int ip_route_connect ( struct rtable * * rp , __be32 dst ,
__be32 src , u32 tos , int oif , u8 protocol ,
2007-02-08 13:09:21 +03:00
__be16 sport , __be16 dport , struct sock * sk ,
int flags )
2005-04-17 02:20:36 +04:00
{
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 ) {
2008-01-23 09:06:48 +03:00
err = __ip_route_output_key ( & init_net , rp , & fl ) ;
2005-04-17 02:20:36 +04:00
if ( err )
return err ;
fl . fl4_dst = ( * rp ) - > rt_dst ;
fl . fl4_src = ( * rp ) - > rt_src ;
ip_rt_put ( * rp ) ;
* rp = NULL ;
}
2006-08-05 10:12:42 +04:00
security_sk_classify_flow ( sk , & fl ) ;
2008-01-23 09:07:10 +03:00
return ip_route_output_flow ( & init_net , rp , & fl , sk , flags ) ;
2005-04-17 02:20:36 +04:00
}
2006-02-01 04:35:35 +03:00
static inline int ip_route_newports ( struct rtable * * rp , u8 protocol ,
2006-09-28 05:34:41 +04:00
__be16 sport , __be16 dport , struct sock * sk )
2005-04-17 02:20:36 +04:00
{
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 ;
2006-02-01 04:35:35 +03:00
fl . proto = protocol ;
2005-04-17 02:20:36 +04:00
ip_rt_put ( * rp ) ;
* rp = NULL ;
2006-08-05 10:12:42 +04:00
security_sk_classify_flow ( sk , & fl ) ;
2008-01-23 09:07:10 +03:00
return ip_route_output_flow ( & init_net , rp , & fl , sk , 0 ) ;
2005-04-17 02:20:36 +04:00
}
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 ;
}
2005-08-16 09:18:02 +04:00
extern ctl_table ipv4_route_table [ ] ;
2005-04-17 02:20:36 +04:00
# endif /* _ROUTE_H */