X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fcompat.h;h=8457dbf316459eff9fb7b698b82587c49d8ad814;hb=6c5d24afea05629135f344108209d3db92574edd;hp=65734ff151bc1424c2a534c47bab3478d3330978;hpb=adda018cb84d550d11f45642d0e04dec20cf1625;p=sliver-openvswitch.git 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 +#include #include +#include +#include + #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 */