Skip to content

Commit

Permalink
datapath: more accurate checksumming in queue_userspace_packet()
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
joestringer committed Jul 24, 2017
1 parent ac8e3c6 commit a0c9fed
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions acinclude.m4
Original file line number Diff line number Diff line change
Expand Up @@ -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])])
Expand Down
2 changes: 1 addition & 1 deletion datapath/datapath.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions datapath/linux/compat/include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit a0c9fed

Please sign in to comment.