]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
r8152: fix wrong checksum status for received IPv4 packets
authorHayes Wang <hayeswang@realtek.com>
Fri, 2 Feb 2018 08:43:35 +0000 (16:43 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Feb 2018 00:19:00 +0000 (19:19 -0500)
The device could only check the checksum of TCP and UDP packets. Therefore,
for the IPv4 packets excluding TCP and UDP, the check of checksum is necessary,
even though the IP checksum is correct.

Take ICMP for example, The IP checksum may be correct, but the ICMP checksum
may be wrong.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/r8152.c

index 0657203ffb9174bac37085613100726f30928a1a..756de9ea8d2e01f79920c5ce45b126ef4da205aa 100644 (file)
@@ -1848,11 +1848,9 @@ static u8 r8152_rx_csum(struct r8152 *tp, struct rx_desc *rx_desc)
        if (opts2 & RD_IPV4_CS) {
                if (opts3 & IPF)
                        checksum = CHECKSUM_NONE;
-               else if ((opts2 & RD_UDP_CS) && (opts3 & UDPF))
-                       checksum = CHECKSUM_NONE;
-               else if ((opts2 & RD_TCP_CS) && (opts3 & TCPF))
-                       checksum = CHECKSUM_NONE;
-               else
+               else if ((opts2 & RD_UDP_CS) && !(opts3 & UDPF))
+                       checksum = CHECKSUM_UNNECESSARY;
+               else if ((opts2 & RD_TCP_CS) && !(opts3 & TCPF))
                        checksum = CHECKSUM_UNNECESSARY;
        } else if (opts2 & RD_IPV6_CS) {
                if ((opts2 & RD_UDP_CS) && !(opts3 & UDPF))