Author: shurd
Date: Fri Oct  5 20:16:20 2018
New Revision: 339207
URL: https://svnweb.freebsd.org/changeset/base/339207

Log:
  Fix igb corrupting checksums with BPF and VLAN
  
  When using a vlan with igb and the vlanhwcsum option, any mbufs which
  already had the TCP, UDP, or SCTP checksum calculated and therefore don't
  have the CSUM_[IP|IP6]_[TCP|UDP|SCTP] bits set in the csum_flags field would
  have the L4 checksum corrupted by the hardware.
  
  This was caused by the driver setting E1000_TXD_POPTS_TXSM any time a
  checksum bit was set OR a vlan tag was present.
  
  The patched driver only sets E1000_TXD_POPTS_TXSM when an offload is
  requested.
  
  PR:           231416
  Reported by:  pi
  Approved by:  re (gjb)
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D17404

Modified:
  head/sys/dev/e1000/igb_txrx.c

Modified: head/sys/dev/e1000/igb_txrx.c
==============================================================================
--- head/sys/dev/e1000/igb_txrx.c       Fri Oct  5 19:27:42 2018        
(r339206)
+++ head/sys/dev/e1000/igb_txrx.c       Fri Oct  5 20:16:20 2018        
(r339207)
@@ -152,7 +152,6 @@ igb_tx_ctx_setup(struct tx_ring *txr, if_pkt_info_t pi
        u32 vlan_macip_lens, type_tucmd_mlhl;
        u32 mss_l4len_idx;
        mss_l4len_idx = vlan_macip_lens = type_tucmd_mlhl = 0;
-       int offload = TRUE; 
 
        /* First check if TSO is to be used */
        if (pi->ipi_csum_flags & CSUM_TSO)
@@ -186,7 +185,6 @@ igb_tx_ctx_setup(struct tx_ring *txr, if_pkt_info_t pi
                type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_IPV6;
                break;
        default:
-               offload = FALSE;
                break;
        }
 
@@ -195,24 +193,26 @@ igb_tx_ctx_setup(struct tx_ring *txr, if_pkt_info_t pi
 
        switch (pi->ipi_ipproto) {
        case IPPROTO_TCP:
-               if (pi->ipi_csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP))
+               if (pi->ipi_csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP)) {
                        type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_L4T_TCP;
+                       *olinfo_status |= E1000_TXD_POPTS_TXSM << 8;
+               }
                break;
        case IPPROTO_UDP:
-               if (pi->ipi_csum_flags & (CSUM_IP_UDP | CSUM_IP6_UDP))
+               if (pi->ipi_csum_flags & (CSUM_IP_UDP | CSUM_IP6_UDP)) {
                        type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_L4T_UDP;
+                       *olinfo_status |= E1000_TXD_POPTS_TXSM << 8;
+               }
                break;
        case IPPROTO_SCTP:
-               if (pi->ipi_csum_flags & (CSUM_IP_SCTP | CSUM_IP6_SCTP))
+               if (pi->ipi_csum_flags & (CSUM_IP_SCTP | CSUM_IP6_SCTP)) {
                        type_tucmd_mlhl |= E1000_ADVTXD_TUCMD_L4T_SCTP;
+                       *olinfo_status |= E1000_TXD_POPTS_TXSM << 8;
+               }
                break;
        default:
-               offload = FALSE;
                break;
        }
-
-       if (offload) /* For the TX descriptor setup */
-               *olinfo_status |= E1000_TXD_POPTS_TXSM << 8;
 
        /* 82575 needs the queue index added */
        if (adapter->hw.mac.type == e1000_82575)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to