X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fnet%2Froute.h;h=086673bced69172e366f460a14f75fff101a9505;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=cabc344999bd94b566b163310c057fa118fb2286;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/include/net/route.h b/include/net/route.h index cabc34499..086673bce 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -7,7 +7,7 @@ * * Version: @(#)route.h 1.0.4 05/27/93 * - * Authors: Ross Biro, + * Authors: Ross Biro * Fred N. van Kempen, * Fixes: * Alan Cox : Reformatted. Added ip_rt_local() @@ -28,14 +28,14 @@ #include #include #include +#include #include #include #include #include #include -#include -#include #include +#include #ifndef __KERNEL__ #warning This file is not supposed to be used outside of kernel. @@ -47,8 +47,9 @@ /* 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) | sk->sk_localroute) +#define RT_CONN_FLAGS(sk) (RT_TOS(inet_sk(sk)->tos) | sock_flag(sk, SOCK_LOCALROUTE)) +struct fib_nh; struct inet_peer; struct rtable { @@ -61,7 +62,8 @@ struct rtable struct in_device *idev; unsigned rt_flags; - unsigned rt_type; + __u16 rt_type; + __u16 rt_multipath_alg; __u32 rt_dst; /* Path destination */ __u32 rt_src; /* Path source */ @@ -76,11 +78,6 @@ struct rtable /* Miscellaneous cached information */ __u32 rt_spec_dst; /* RFC1122 specific destination */ struct inet_peer *peer; /* long-living peer info */ - -#ifdef CONFIG_IP_ROUTE_NAT - __u32 rt_src_map; - __u32 rt_dst_map; -#endif }; struct ip_rt_acct @@ -111,16 +108,12 @@ struct rt_cache_stat unsigned int out_hlist_search; }; -extern struct rt_cache_stat *rt_cache_stat; -#define RT_CACHE_STAT_INC(field) \ - (per_cpu_ptr(rt_cache_stat, smp_processor_id())->field++) - extern struct ip_rt_acct *ip_rt_acct; struct in_device; extern int ip_rt_init(void); extern void ip_rt_redirect(u32 old_gw, u32 dst, u32 new_gw, - u32 src, u8 tos, struct net_device *dev); + u32 src, struct net_device *dev); extern void ip_rt_advice(struct rtable **rp, int advice); extern void rt_cache_flush(int how); extern int __ip_route_output_key(struct rtable **, const struct flowi *flp); @@ -132,10 +125,13 @@ extern void ip_rt_send_redirect(struct sk_buff *skb); extern unsigned inet_addr_type(u32 addr); extern void ip_rt_multicast_event(struct in_device *); -extern int ip_rt_ioctl(unsigned int cmd, void *arg); +extern int ip_rt_ioctl(unsigned int cmd, void __user *arg); extern void ip_rt_get_source(u8 *src, struct rtable *rt); extern int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb); +struct in_ifaddr; +extern void fib_add_ifaddr(struct in_ifaddr *); + static inline void ip_rt_put(struct rtable * rt) { if (rt) @@ -151,7 +147,7 @@ static inline char rt_tos2priority(u8 tos) return ip_tos2prio[IPTOS_TOS(tos)>>1]; } -#define IPI_LOOPBACK 0x0100007f +#define IPI_LOOPBACK htonl(INADDR_LOOPBACK) static inline int ip_find_src(struct nx_info *nxi, struct rtable **rp, struct flowi *fl) { @@ -222,7 +218,8 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, if (sk) nx_info = sk->sk_nx_info; - vxdprintk("ip_route_connect(%p) %p,%p;%lx\n", + vxdprintk(VXD_CBIT(net, 4), + "ip_route_connect(%p) %p,%p;%lx", sk, nx_info, sk->sk_socket, (sk->sk_socket?sk->sk_socket->flags:0)); @@ -232,7 +229,11 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, return err; if (fl.fl4_dst == IPI_LOOPBACK && !vx_check(0, VX_ADMIN)) fl.fl4_dst = nx_info->ipv4[0]; - } +#ifdef CONFIG_VSERVER_REMAP_SADDR + if (fl.fl4_src == IPI_LOOPBACK && !vx_check(0, VX_ADMIN)) + fl.fl4_src = nx_info->ipv4[0]; +#endif + } if (!fl.fl4_dst || !fl.fl4_src) { err = __ip_route_output_key(rp, &fl); if (err) @@ -245,8 +246,8 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, return ip_route_output_flow(rp, &fl, sk, 0); } -static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport, - struct sock *sk) +static inline int ip_route_newports(struct rtable **rp, u8 protocol, + u16 sport, u16 dport, struct sock *sk) { if (sport != (*rp)->fl.fl_ip_sport || dport != (*rp)->fl.fl_ip_dport) { @@ -255,6 +256,7 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport, memcpy(&fl, &(*rp)->fl, sizeof(fl)); fl.fl_ip_sport = sport; fl.fl_ip_dport = dport; + fl.proto = protocol; ip_rt_put(*rp); *rp = NULL; return ip_route_output_flow(rp, &fl, sk, 0); @@ -273,4 +275,6 @@ static inline struct inet_peer *rt_get_peer(struct rtable *rt) return rt->peer; } +extern ctl_table ipv4_route_table[]; + #endif /* _ROUTE_H */