sfc: Define and set RX buffer flag for packets parsed as TCP
authorBen Hutchings <bhutchings@solarflare.com>
Thu, 16 May 2013 17:38:11 +0000 (18:38 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Mon, 24 Jun 2013 18:58:32 +0000 (19:58 +0100)
This will be useful for shortcutting some software packet parsing.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/nic.c

index 2dec48b..f4c7e6b 100644 (file)
@@ -243,6 +243,7 @@ struct efx_rx_buffer {
 #define EFX_RX_BUF_LAST_IN_PAGE        0x0001
 #define EFX_RX_PKT_CSUMMED     0x0002
 #define EFX_RX_PKT_DISCARD     0x0004
+#define EFX_RX_PKT_TCP         0x0040
 
 /**
  * struct efx_rx_page_state - Page-based rx buffer state
index 39432d3..f2b864c 100644 (file)
@@ -1080,12 +1080,21 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
        rx_ev_hdr_type = EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_HDR_TYPE);
 
        if (likely(rx_ev_pkt_ok)) {
-               /* If packet is marked as OK and packet type is TCP/IP or
-                * UDP/IP, then we can rely on the hardware checksum.
+               /* If packet is marked as OK then we can rely on the
+                * hardware checksum and classification.
                 */
-               flags = (rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP ||
-                        rx_ev_hdr_type == FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP) ?
-                       EFX_RX_PKT_CSUMMED : 0;
+               flags = 0;
+               switch (rx_ev_hdr_type) {
+               case FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP:
+                       flags |= EFX_RX_PKT_TCP;
+                       /* fall through */
+               case FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP:
+                       flags |= EFX_RX_PKT_CSUMMED;
+                       /* fall through */
+               case FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_OTHER:
+               case FSE_AZ_RX_EV_HDR_TYPE_OTHER:
+                       break;
+               }
        } else {
                flags = efx_handle_rx_not_ok(rx_queue, event);
        }