• Govindarajulu Varadarajan's avatar
    enic: fix rx skb checksum · 969d621e
    Govindarajulu Varadarajan authored
    commit 17e96834 upstream.
    
    Hardware always provides compliment of IP pseudo checksum. Stack expects
    whole packet checksum without pseudo checksum if CHECKSUM_COMPLETE is set.
    
    This causes checksum error in nf & ovs.
    
    kernel: qg-19546f09-f2: hw csum failure
    kernel: CPU: 9 PID: 0 Comm: swapper/9 Tainted: GF          O--------------   3.10.0-123.8.1.el7.x86_64 #1
    kernel: Hardware name: Cisco Systems Inc UCSB-B200-M3/UCSB-B200-M3, BIOS B200M3.2.2.3.0.080820141339 08/08/2014
    kernel: ffff881218f40000 df68243feb35e3a8 ffff881237a43ab8 ffffffff815e237b
    kernel: ffff881237a43ad0 ffffffff814cd4ca ffff8829ec71eb00 ffff881237a43af0
    kernel: ffffffff814c6232 0000000000000286 ffff8829ec71eb00 ffff881237a43b00
    kernel: Call Trace:
    kernel: <IRQ>  [<ffffffff815e237b>] dump_stack+0x19/0x1b
    kernel: [<ffffffff814cd4ca>] netdev_rx_csum_fault+0x3a/0x40
    kernel: [<ffffffff814c6232>] __skb_checksum_complete_head+0x62/0x70
    kernel: [<ffffffff814c6251>] __skb_checksum_complete+0x11/0x20
    kernel: [<ffffffff8155a20c>] nf_ip_checksum+0xcc/0x100
    kernel: [<ffffffffa049edc7>] icmp_error+0x1f7/0x35c [nf_conntrack_ipv4]
    kernel: [<ffffffff814cf419>] ? netif_rx+0xb9/0x1d0
    kernel: [<ffffffffa040eb7b>] ? internal_dev_recv+0xdb/0x130 [openvswitch]
    kernel: [<ffffffffa04c8330>] nf_conntrack_in+0xf0/0xa80 [nf_conntrack]
    kernel: [<ffffffff81509380>] ? inet_del_offload+0x40/0x40
    kernel: [<ffffffffa049e302>] ipv4_conntrack_in+0x22/0x30 [nf_conntrack_ipv4]
    kernel: [<ffffffff815005ca>] nf_iterate+0xaa/0xc0
    kernel: [<ffffffff81509380>] ? inet_del_offload+0x40/0x40
    kernel: [<ffffffff81500664>] nf_hook_slow+0x84/0x140
    kernel: [<ffffffff81509380>] ? inet_del_offload+0x40/0x40
    kernel: [<ffffffff81509dd4>] ip_rcv+0x344/0x380
    
    Hardware verifies IP & tcp/udp header checksum but does not provide payload
    checksum, use CHECKSUM_UNNECESSARY. Set it only if its valid IP tcp/udp packet.
    
    Cc: Jiri Benc <jbenc@redhat.com>
    Cc: Stefan Assmann <sassmann@redhat.com>
    Reported-by: default avatarSunil Choudhary <schoudha@redhat.com>
    Signed-off-by: default avatarGovindarajulu Varadarajan <_govind@gmx.com>
    Reviewed-by: default avatarJiri Benc <jbenc@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    969d621e
enic_main.c 61 KB