]> Pileus Git - ~andy/linux/commitdiff
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 2dec48bed27486b5915b3958080c41b3290eff2d..f4c7e6b67743b93eaa8d2c318705a05dd3302f8b 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 39432d3d1fe908aa4134bc5e0f49cb771f126848..f2b864c14ca9e15a28f1bdf877095b7e155a05ad 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);
        }