diff mbox

[ovs-dev,1/2] datapath: maintain correct checksum state in conntrack actions.

Message ID 20170303032952.1125-2-joe@ovn.org
State Accepted, archived
Headers show

Commit Message

Joe Stringer March 3, 2017, 3:29 a.m. UTC
From: Lance Richardson <lrichard@redhat.com>

Upstream commit:
    commit 75f01a4c9cc291ff5cb28ca1216adb163b7a20ee
    Author: Lance Richardson <lrichard@redhat.com>
    Date: Thu Jan 12 19:33:18 2017 -0500

    openvswitch: maintain correct checksum state in conntrack actions

    When executing conntrack actions on skbuffs with checksum mode
    CHECKSUM_COMPLETE, the checksum must be updated to account for
    header pushes and pulls. Otherwise we get "hw csum failure"
    logs similar to this (ICMP packet received on geneve tunnel
    via ixgbe NIC):

    [  405.740065] genev_sys_6081: hw csum failure
    [  405.740106] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G          I     4.10.0-rc3+ #1
    [  405.740108] Call Trace:
    [  405.740110]  <IRQ>
    [  405.740113]  dump_stack+0x63/0x87
    [  405.740116]  netdev_rx_csum_fault+0x3a/0x40
    [  405.740118]  __skb_checksum_complete+0xcf/0xe0
    [  405.740120]  nf_ip_checksum+0xc8/0xf0
    [  405.740124]  icmp_error+0x1de/0x351 [nf_conntrack_ipv4]
    [  405.740132]  nf_conntrack_in+0xe1/0x550 [nf_conntrack]
    [  405.740137]  ? find_bucket.isra.2+0x62/0x70 [openvswitch]
    [  405.740143]  __ovs_ct_lookup+0x95/0x980 [openvswitch]
    [  405.740145]  ? netif_rx_internal+0x44/0x110
    [  405.740149]  ovs_ct_execute+0x147/0x4b0 [openvswitch]
    [  405.740153]  do_execute_actions+0x22e/0xa70 [openvswitch]
    [  405.740157]  ovs_execute_actions+0x40/0x120 [openvswitch]
    [  405.740161]  ovs_dp_process_packet+0x84/0x120 [openvswitch]
    [  405.740166]  ovs_vport_receive+0x73/0xd0 [openvswitch]
    [  405.740168]  ? udp_rcv+0x1a/0x20
    [  405.740170]  ? ip_local_deliver_finish+0x93/0x1e0
    [  405.740172]  ? ip_local_deliver+0x6f/0xe0
    [  405.740174]  ? ip_rcv_finish+0x3a0/0x3a0
    [  405.740176]  ? ip_rcv_finish+0xdb/0x3a0
    [  405.740177]  ? ip_rcv+0x2a7/0x400
    [  405.740180]  ? __netif_receive_skb_core+0x970/0xa00
    [  405.740185]  netdev_frame_hook+0xd3/0x160 [openvswitch]
    [  405.740187]  __netif_receive_skb_core+0x1dc/0xa00
    [  405.740194]  ? ixgbe_clean_rx_irq+0x46d/0xa20 [ixgbe]
    [  405.740197]  __netif_receive_skb+0x18/0x60
    [  405.740199]  netif_receive_skb_internal+0x40/0xb0
    [  405.740201]  napi_gro_receive+0xcd/0x120
    [  405.740204]  gro_cell_poll+0x57/0x80 [geneve]
    [  405.740206]  net_rx_action+0x260/0x3c0
    [  405.740209]  __do_softirq+0xc9/0x28c
    [  405.740211]  irq_exit+0xd9/0xf0
    [  405.740213]  do_IRQ+0x51/0xd0
    [  405.740215]  common_interrupt+0x93/0x93

    Fixes: 7f8a436eaa2c ("openvswitch: Add conntrack action")
    Signed-off-by: Lance Richardson <lrichard@redhat.com>
    Acked-by: Pravin B Shelar <pshelar@ovn.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Upstream: 75f01a4c9cc2 ("openvswitch: maintain correct checksum state in conntrack actions")
Signed-off-by: Joe Stringer <joe@ovn.org>
---
 datapath/conntrack.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Jarno Rajahalme March 3, 2017, 7:04 p.m. UTC | #1
Acked-by: Jarno Rajahalme <jarno@ovn.org>

> On Mar 2, 2017, at 7:29 PM, Joe Stringer <joe@ovn.org> wrote:
> 
> From: Lance Richardson <lrichard@redhat.com>
> 
> Upstream commit:
>    commit 75f01a4c9cc291ff5cb28ca1216adb163b7a20ee
>    Author: Lance Richardson <lrichard@redhat.com>
>    Date: Thu Jan 12 19:33:18 2017 -0500
> 
>    openvswitch: maintain correct checksum state in conntrack actions
> 
>    When executing conntrack actions on skbuffs with checksum mode
>    CHECKSUM_COMPLETE, the checksum must be updated to account for
>    header pushes and pulls. Otherwise we get "hw csum failure"
>    logs similar to this (ICMP packet received on geneve tunnel
>    via ixgbe NIC):
> 
>    [  405.740065] genev_sys_6081: hw csum failure
>    [  405.740106] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G          I     4.10.0-rc3+ #1
>    [  405.740108] Call Trace:
>    [  405.740110]  <IRQ>
>    [  405.740113]  dump_stack+0x63/0x87
>    [  405.740116]  netdev_rx_csum_fault+0x3a/0x40
>    [  405.740118]  __skb_checksum_complete+0xcf/0xe0
>    [  405.740120]  nf_ip_checksum+0xc8/0xf0
>    [  405.740124]  icmp_error+0x1de/0x351 [nf_conntrack_ipv4]
>    [  405.740132]  nf_conntrack_in+0xe1/0x550 [nf_conntrack]
>    [  405.740137]  ? find_bucket.isra.2+0x62/0x70 [openvswitch]
>    [  405.740143]  __ovs_ct_lookup+0x95/0x980 [openvswitch]
>    [  405.740145]  ? netif_rx_internal+0x44/0x110
>    [  405.740149]  ovs_ct_execute+0x147/0x4b0 [openvswitch]
>    [  405.740153]  do_execute_actions+0x22e/0xa70 [openvswitch]
>    [  405.740157]  ovs_execute_actions+0x40/0x120 [openvswitch]
>    [  405.740161]  ovs_dp_process_packet+0x84/0x120 [openvswitch]
>    [  405.740166]  ovs_vport_receive+0x73/0xd0 [openvswitch]
>    [  405.740168]  ? udp_rcv+0x1a/0x20
>    [  405.740170]  ? ip_local_deliver_finish+0x93/0x1e0
>    [  405.740172]  ? ip_local_deliver+0x6f/0xe0
>    [  405.740174]  ? ip_rcv_finish+0x3a0/0x3a0
>    [  405.740176]  ? ip_rcv_finish+0xdb/0x3a0
>    [  405.740177]  ? ip_rcv+0x2a7/0x400
>    [  405.740180]  ? __netif_receive_skb_core+0x970/0xa00
>    [  405.740185]  netdev_frame_hook+0xd3/0x160 [openvswitch]
>    [  405.740187]  __netif_receive_skb_core+0x1dc/0xa00
>    [  405.740194]  ? ixgbe_clean_rx_irq+0x46d/0xa20 [ixgbe]
>    [  405.740197]  __netif_receive_skb+0x18/0x60
>    [  405.740199]  netif_receive_skb_internal+0x40/0xb0
>    [  405.740201]  napi_gro_receive+0xcd/0x120
>    [  405.740204]  gro_cell_poll+0x57/0x80 [geneve]
>    [  405.740206]  net_rx_action+0x260/0x3c0
>    [  405.740209]  __do_softirq+0xc9/0x28c
>    [  405.740211]  irq_exit+0xd9/0xf0
>    [  405.740213]  do_IRQ+0x51/0xd0
>    [  405.740215]  common_interrupt+0x93/0x93
> 
>    Fixes: 7f8a436eaa2c ("openvswitch: Add conntrack action")
>    Signed-off-by: Lance Richardson <lrichard@redhat.com>
>    Acked-by: Pravin B Shelar <pshelar@ovn.org>
>    Signed-off-by: David S. Miller <davem@davemloft.net>
> 
> Upstream: 75f01a4c9cc2 ("openvswitch: maintain correct checksum state in conntrack actions")
> Signed-off-by: Joe Stringer <joe@ovn.org>
> ---
> datapath/conntrack.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/datapath/conntrack.c b/datapath/conntrack.c
> index e4e76b836805..36db32abbf63 100644
> --- a/datapath/conntrack.c
> +++ b/datapath/conntrack.c
> @@ -555,7 +555,7 @@ static int ovs_ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct,
> 	int hooknum, nh_off, err = NF_ACCEPT;
> 
> 	nh_off = skb_network_offset(skb);
> -	skb_pull(skb, nh_off);
> +	skb_pull_rcsum(skb, nh_off);
> 
> 	/* See HOOK2MANIP(). */
> 	if (maniptype == NF_NAT_MANIP_SRC)
> @@ -620,6 +620,7 @@ static int ovs_ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct,
> 	err = nf_nat_packet(ct, ctinfo, hooknum, skb);
> push:
> 	skb_push(skb, nh_off);
> +	skb_postpush_rcsum(skb, skb->data, nh_off);
> 
> 	return err;
> }
> @@ -927,7 +928,7 @@ int ovs_ct_execute(struct net *net, struct sk_buff *skb,
> 
> 	/* The conntrack module expects to be working at L3. */
> 	nh_ofs = skb_network_offset(skb);
> -	skb_pull(skb, nh_ofs);
> +	skb_pull_rcsum(skb, nh_ofs);
> 
> 	if (key->ip.frag != OVS_FRAG_TYPE_NONE) {
> 		err = handle_fragments(net, key, info->zone.id, skb);
> @@ -941,6 +942,7 @@ int ovs_ct_execute(struct net *net, struct sk_buff *skb,
> 		err = ovs_ct_lookup(net, key, info, skb);
> 
> 	skb_push(skb, nh_ofs);
> +	skb_postpush_rcsum(skb, skb->data, nh_ofs);
> 	if (err)
> 		kfree_skb(skb);
> 	return err;
> -- 
> 2.11.1
>
Joe Stringer March 3, 2017, 10:53 p.m. UTC | #2
On 3 March 2017 at 11:04, Jarno Rajahalme <jarno@ovn.org> wrote:
> Acked-by: Jarno Rajahalme <jarno@ovn.org>

Thanks, applied. (This was already applied to branch-2.7).
diff mbox

Patch

diff --git a/datapath/conntrack.c b/datapath/conntrack.c
index e4e76b836805..36db32abbf63 100644
--- a/datapath/conntrack.c
+++ b/datapath/conntrack.c
@@ -555,7 +555,7 @@  static int ovs_ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct,
 	int hooknum, nh_off, err = NF_ACCEPT;
 
 	nh_off = skb_network_offset(skb);
-	skb_pull(skb, nh_off);
+	skb_pull_rcsum(skb, nh_off);
 
 	/* See HOOK2MANIP(). */
 	if (maniptype == NF_NAT_MANIP_SRC)
@@ -620,6 +620,7 @@  static int ovs_ct_nat_execute(struct sk_buff *skb, struct nf_conn *ct,
 	err = nf_nat_packet(ct, ctinfo, hooknum, skb);
 push:
 	skb_push(skb, nh_off);
+	skb_postpush_rcsum(skb, skb->data, nh_off);
 
 	return err;
 }
@@ -927,7 +928,7 @@  int ovs_ct_execute(struct net *net, struct sk_buff *skb,
 
 	/* The conntrack module expects to be working at L3. */
 	nh_ofs = skb_network_offset(skb);
-	skb_pull(skb, nh_ofs);
+	skb_pull_rcsum(skb, nh_ofs);
 
 	if (key->ip.frag != OVS_FRAG_TYPE_NONE) {
 		err = handle_fragments(net, key, info->zone.id, skb);
@@ -941,6 +942,7 @@  int ovs_ct_execute(struct net *net, struct sk_buff *skb,
 		err = ovs_ct_lookup(net, key, info, skb);
 
 	skb_push(skb, nh_ofs);
+	skb_postpush_rcsum(skb, skb->data, nh_ofs);
 	if (err)
 		kfree_skb(skb);
 	return err;