summaryrefslogtreecommitdiff
path: root/datapath/linux/compat/ip_output-openvswitch.c
diff options
context:
space:
mode:
Diffstat (limited to 'datapath/linux/compat/ip_output-openvswitch.c')
-rw-r--r--datapath/linux/compat/ip_output-openvswitch.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/datapath/linux/compat/ip_output-openvswitch.c b/datapath/linux/compat/ip_output-openvswitch.c
new file mode 100644
index 000000000..a09fcbce4
--- /dev/null
+++ b/datapath/linux/compat/ip_output-openvswitch.c
@@ -0,0 +1,33 @@
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
+
+#include <linux/netfilter_ipv4.h>
+#include <net/ip.h>
+
+int __ip_local_out(struct sk_buff *skb)
+{
+ struct iphdr *iph = ip_hdr(skb);
+
+ iph->tot_len = htons(skb->len);
+ ip_send_check(iph);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+ return nf_hook(PF_INET, NF_IP_LOCAL_OUT, &skb, NULL, skb->dst->dev,
+ dst_output);
+#else
+ return nf_hook(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev,
+ dst_output);
+#endif /* kernel < 2.6.24 */
+}
+
+int ip_local_out(struct sk_buff *skb)
+{
+ int err;
+
+ err = __ip_local_out(skb);
+ if (likely(err == 1))
+ err = dst_output(skb);
+
+ return err;
+}
+
+#endif /* kernel < 2.6.25 */