X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fcompat.h;h=bc7e8805527ea3c3e0e9a6d0e4d659e46a0ca1d9;hb=d3fe1c2bb30f9f0ce848ade951122770394cccfb;hp=4dfd1926df979ad354e287fb1497ab08966951fb;hpb=1b7ee51f9d340aa6c9f6a5772f4e79cbfd17565d;p=sliver-openvswitch.git diff --git a/datapath/compat.h b/datapath/compat.h index 4dfd1926d..bc7e88055 100644 --- a/datapath/compat.h +++ b/datapath/compat.h @@ -19,32 +19,11 @@ #ifndef COMPAT_H #define COMPAT_H 1 +#include +#include #include - -#ifndef HAVE_NLA_NUL_STRING -static inline int CHECK_NUL_STRING(struct nlattr *attr, int maxlen) -{ - char *s; - int len; - if (!attr) - return 0; - - len = nla_len(attr); - if (len >= maxlen) - return -EINVAL; - - s = nla_data(attr); - if (s[len - 1] != '\0') - return -EINVAL; - - return 0; -} -#else -static inline int CHECK_NUL_STRING(struct nlattr *attr, int maxlen) -{ - return 0; -} -#endif /* !HAVE_NLA_NUL_STRING */ +#include +#include static inline void skb_clear_rxhash(struct sk_buff *skb) { @@ -53,47 +32,12 @@ static inline void skb_clear_rxhash(struct sk_buff *skb) #endif } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) -#define GENL_SOCK(net) (genl_sock) -#define SET_NETNSOK +#ifdef HAVE_PARALLEL_OPS +#define SET_PARALLEL_OPS .parallel_ops = true, #else -#define GENL_SOCK(net) ((net)->genl_sock) -#define SET_NETNSOK .netnsok = true, +#define SET_PARALLEL_OPS #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -#ifdef CONFIG_NETFILTER -static inline u32 skb_get_mark(struct sk_buff *skb) -{ - return skb->nfmark; -} - -static inline void skb_set_mark(struct sk_buff *skb, u32 mark) -{ - skb->nfmark = mark; -} -#else /* CONFIG_NETFILTER */ -static inline u32 skb_get_mark(struct sk_buff *skb) -{ - return 0; -} - -static inline void skb_set_mark(struct sk_buff *skb, u32 mark) -{ -} -#endif -#else /* before 2.6.20 */ -static inline u32 skb_get_mark(struct sk_buff *skb) -{ - return skb->mark; -} - -static inline void skb_set_mark(struct sk_buff *skb, u32 mark) -{ - skb->mark = mark; -} -#endif /* after 2.6.20 */ - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) #define rt_dst(rt) (rt->dst) #else @@ -106,4 +50,36 @@ 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, + .tos = RT_TOS(tos) } }, + .mark = skb_mark, + .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 */