From 7fe9460749cec006cd1611fc3de1f7ed21f07e98 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 5 Sep 2008 21:23:34 -0700 Subject: [PATCH] Compatibility fixes for 2.6.18 kernel Functions added in the 2.6.22 kernel in tcp.h and skbuff.h have been added to the compatibility headers. Additionally the data argument was dropped in 2.6.22 for the work queue macros, requiring them to be redfined for previous kernels. Based on changes from David Erickson. --- .../compat-2.6/include/linux/skbuff.h | 4 ++ .../linux-2.6/compat-2.6/include/linux/tcp.h | 5 +++ .../compat-2.6/include/linux/workqueue.h | 42 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 datapath/linux-2.6/compat-2.6/include/linux/workqueue.h diff --git a/datapath/linux-2.6/compat-2.6/include/linux/skbuff.h b/datapath/linux-2.6/compat-2.6/include/linux/skbuff.h index 878e58de..9430f527 100644 --- a/datapath/linux-2.6/compat-2.6/include/linux/skbuff.h +++ b/datapath/linux-2.6/compat-2.6/include/linux/skbuff.h @@ -66,6 +66,10 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) skb->mac.raw = skb->data + offset; } +static inline int skb_transport_offset(const struct sk_buff *skb) +{ + return skb_transport_header(skb) - skb->data; +} #endif /* linux kernel < 2.6.22 */ #endif diff --git a/datapath/linux-2.6/compat-2.6/include/linux/tcp.h b/datapath/linux-2.6/compat-2.6/include/linux/tcp.h index 528f16af..e8b51977 100644 --- a/datapath/linux-2.6/compat-2.6/include/linux/tcp.h +++ b/datapath/linux-2.6/compat-2.6/include/linux/tcp.h @@ -11,6 +11,11 @@ static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) { return (struct tcphdr *)skb_transport_header(skb); } + +static inline unsigned int tcp_hdrlen(const struct sk_buff *skb) +{ + return tcp_hdr(skb)->doff * 4; +} #endif /* __KERNEL__ */ #endif /* linux kernel < 2.6.22 */ diff --git a/datapath/linux-2.6/compat-2.6/include/linux/workqueue.h b/datapath/linux-2.6/compat-2.6/include/linux/workqueue.h new file mode 100644 index 00000000..1ac3b6ec --- /dev/null +++ b/datapath/linux-2.6/compat-2.6/include/linux/workqueue.h @@ -0,0 +1,42 @@ +#ifndef __LINUX_WORKQUEUE_WRAPPER_H +#define __LINUX_WORKQUEUE_WRAPPER_H 1 + +#include_next + +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + +#ifdef __KERNEL__ +/* + * initialize a work-struct's func and data pointers: + */ +#undef PREPARE_WORK +#define PREPARE_WORK(_work, _func) \ + do { \ + (_work)->func = (void(*)(void*)) _func; \ + (_work)->data = _work; \ + } while (0) + +/* + * initialize all of a work-struct: + */ +#undef INIT_WORK +#define INIT_WORK(_work, _func) \ + do { \ + INIT_LIST_HEAD(&(_work)->entry); \ + (_work)->pending = 0; \ + PREPARE_WORK((_work), (_func)); \ + init_timer(&(_work)->timer); \ + } while (0) + +#endif /* __KERNEL__ */ + +#endif /* linux kernel < 2.6.20 */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) +/* There is no equivalent to cancel_work_sync() so just flush all + * pending work. */ +#define cancel_work_sync(_work) flush_scheduled_work() +#endif + +#endif -- 2.30.2