Upstream commit:
commit 7529390d08f07fbf9b0174c5a87600b5caa1a8e8
Author: Davide Caratti <[email protected]>
Date: Thu May 18 15:44:42 2017 +0200
openvswitch: more accurate checksumming in queue_userspace_packet()
if skb carries an SCTP packet and ip_summed is CHECKSUM_PARTIAL, it needs
CRC32c in place of Internet Checksum: use skb_csum_hwoffload_help to avoid
corrupting such packets while queueing them towards userspace.
Signed-off-by: Davide Caratti <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
Signed-off-by: Joe Stringer <[email protected]>
---
acinclude.m4 | 1 +
datapath/datapath.c | 2 +-
datapath/linux/compat/include/linux/netdevice.h | 15 +++++++++++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/acinclude.m4 b/acinclude.m4
index 62a91e650a4a..91a5585e2512 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -538,6 +538,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
[OVS_DEFINE([HAVE_PCPU_SW_NETSTATS])])
OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h],
[netif_needs_gso.*net_device],
[OVS_DEFINE([HAVE_NETIF_NEEDS_GSO_NETDEV])])
+ OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [skb_csum_hwoffload_help])
OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [udp_offload])
OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [udp_offload.*uoff],
[OVS_DEFINE([HAVE_UDP_OFFLOAD_ARG_UOFF])])
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 82cad74b7972..6d252d7516d3 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -460,7 +460,7 @@ static int queue_userspace_packet(struct datapath *dp,
struct sk_buff *skb,
/* Complete checksum if needed */
if (skb->ip_summed == CHECKSUM_PARTIAL &&
- (err = skb_checksum_help(skb)))
+ (err = skb_csum_hwoffload_help(skb, 0)))
goto out;
/* Older versions of OVS user space enforce alignment of the last
diff --git a/datapath/linux/compat/include/linux/netdevice.h
b/datapath/linux/compat/include/linux/netdevice.h
index 75315dc16e02..878c30a6da4a 100644
--- a/datapath/linux/compat/include/linux/netdevice.h
+++ b/datapath/linux/compat/include/linux/netdevice.h
@@ -270,4 +270,19 @@ static inline void netdev_reset_rx_headroom(struct
net_device *dev)
#define IFF_NO_QUEUE 0
#endif
+#ifndef HAVE_SKB_CSUM_HWOFFLOAD_HELP
+static inline int skb_csum_hwoffload_help(struct sk_buff *skb,
+ const netdev_features_t features)
+{
+ /* It's less accurate to approximate to this for older kernels, but
+ * it was sufficient for a long time. If you care about ensuring that
+ * upstream commit 7529390d08f0 has the same effect on older kernels,
+ * consider backporting the following commits:
+ * b72b5bf6a8fc ("net: introduce skb_crc32c_csum_help")
+ * 43c26a1a4593 ("net: more accurate checksumming in
validate_xmit_skb()")
+ */
+ return skb_checksum_help(skb);
+}
+#endif
+
#endif /* __LINUX_NETDEVICE_WRAPPER_H */
--
2.11.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev