diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2013-07-29 15:47:34 -0700 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2013-08-13 00:15:04 -0700 |
commit | 6c5d24afea05629135f344108209d3db92574edd (patch) | |
tree | 52c095bffe90d9e65372717ad3db696110468f27 /datapath/compat.h | |
parent | adda018cb84d550d11f45642d0e04dec20cf1625 (diff) | |
download | openvswitch-6c5d24afea05629135f344108209d3db92574edd.tar.gz |
datapath: Move find_route() to compat.h
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath/compat.h')
-rw-r--r-- | datapath/compat.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/datapath/compat.h b/datapath/compat.h index 65734ff15..8457dbf31 100644 --- a/datapath/compat.h +++ b/datapath/compat.h @@ -19,7 +19,12 @@ #ifndef COMPAT_H #define COMPAT_H 1 +#include <linux/in.h> +#include <linux/in_route.h> #include <linux/netlink.h> +#include <net/route.h> +#include <net/xfrm.h> + #ifndef HAVE_NLA_NUL_STRING static inline int CHECK_NUL_STRING(struct nlattr *attr, int maxlen) @@ -113,4 +118,41 @@ static inline void skb_set_mark(struct sk_buff *skb, u32 mark) #define inet_sport(sk) (inet_sk(sk)->inet_sport) #endif +static inline struct rtable *find_route(struct net *net, + __be32 *saddr, __be32 daddr, + u8 ipproto, u8 tos, u32 skb_mark) +{ + struct rtable *rt; + /* Tunnel configuration keeps DSCP part of TOS bits, But Linux + * router expect RT_TOS bits only. */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39) + struct flowi fl = { .nl_u = { .ip4_u = { + .daddr = daddr, + .saddr = *saddr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + .fwmark = skb_mark, +#endif + .tos = RT_TOS(tos) } }, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + .mark = skb_mark, +#endif + .proto = ipproto }; + + if (unlikely(ip_route_output_key(net, &rt, &fl))) + return ERR_PTR(-EADDRNOTAVAIL); + *saddr = fl.nl_u.ip4_u.saddr; + return rt; +#else + struct flowi4 fl = { .daddr = daddr, + .saddr = *saddr, + .flowi4_tos = RT_TOS(tos), + .flowi4_mark = skb_mark, + .flowi4_proto = ipproto }; + + rt = ip_route_output_key(net, &fl); + *saddr = fl.saddr; + return rt; +#endif +} #endif /* compat.h */ |