|
@@ -304,25 +304,40 @@ static void ixgbe_receive_skb(struct ixgbe_adapter *adapter,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbe_rx_checksum - indicate in skb if hw indicated a good cksum
|
|
|
+ * @adapter: address of board private structure
|
|
|
+ * @status_err: hardware indication of status of receive
|
|
|
+ * @skb: skb currently being received and modified
|
|
|
+ **/
|
|
|
static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
|
|
|
u32 status_err,
|
|
|
struct sk_buff *skb)
|
|
|
{
|
|
|
skb->ip_summed = CHECKSUM_NONE;
|
|
|
|
|
|
- /* Ignore Checksum bit is set */
|
|
|
+ /* Ignore Checksum bit is set, or rx csum disabled */
|
|
|
if ((status_err & IXGBE_RXD_STAT_IXSM) ||
|
|
|
- !(adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED))
|
|
|
+ !(adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED))
|
|
|
return;
|
|
|
- /* TCP/UDP checksum error bit is set */
|
|
|
- if (status_err & (IXGBE_RXDADV_ERR_TCPE | IXGBE_RXDADV_ERR_IPE)) {
|
|
|
- /* let the stack verify checksum errors */
|
|
|
+
|
|
|
+ /* if IP and error */
|
|
|
+ if ((status_err & IXGBE_RXD_STAT_IPCS) &&
|
|
|
+ (status_err & IXGBE_RXDADV_ERR_IPE)) {
|
|
|
adapter->hw_csum_rx_error++;
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ if (!(status_err & IXGBE_RXD_STAT_L4CS))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (status_err & IXGBE_RXDADV_ERR_TCPE) {
|
|
|
+ adapter->hw_csum_rx_error++;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* It must be a TCP or UDP packet with a valid checksum */
|
|
|
- if (status_err & (IXGBE_RXD_STAT_L4CS | IXGBE_RXD_STAT_UDPCS))
|
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
adapter->hw_csum_rx_good++;
|
|
|
}
|
|
|
|