cxgb4: don't offload Rx checksums for IPv6 fragments
Dimitris Michailidis [Mon, 2 Aug 2010 13:19:17 +0000 (13:19 +0000)]
The checksum provided by the device doesn't include the L3 headers,
as IPv6 expects.

Signed-off-by: Dimitris Michailidis <dm@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

drivers/net/cxgb4/sge.c
drivers/net/cxgb4/t4_msg.h

index 4388f72..304302a 100644 (file)
@@ -1593,14 +1593,15 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
 
        if (csum_ok && (pi->rx_offload & RX_CSO) &&
            (pkt->l2info & htonl(RXF_UDP | RXF_TCP))) {
-               if (!pkt->ip_frag)
+               if (!pkt->ip_frag) {
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
-               else {
+                       rxq->stats.rx_cso++;
+               } else if (pkt->l2info & htonl(RXF_IP)) {
                        __sum16 c = (__force __sum16)pkt->csum;
                        skb->csum = csum_unfold(c);
                        skb->ip_summed = CHECKSUM_COMPLETE;
+                       rxq->stats.rx_cso++;
                }
-               rxq->stats.rx_cso++;
        } else
                skb->ip_summed = CHECKSUM_NONE;
 
index 623932b..a550d0c 100644 (file)
@@ -529,6 +529,8 @@ struct cpl_rx_pkt {
        __be32 l2info;
 #define RXF_UDP (1 << 22)
 #define RXF_TCP (1 << 23)
+#define RXF_IP  (1 << 24)
+#define RXF_IP6 (1 << 25)
        __be16 hdr_len;
        __be16 err_vec;
 };