bnx2x: increase inner ip id during encapsulated tso
authorDmitry Kravkov <dmitry@broadcom.com>
Thu, 21 Mar 2013 15:38:24 +0000 (15:38 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 22 Mar 2013 14:23:34 +0000 (10:23 -0400)
57712/578xx devices during handling of encapsulated TSO can
properly increase ip id for only one ip header.
The patch selects inner header to be increased.

Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
CC: Eilon Greenstein <eilong@broadcom.com>
CC: Ariel Elior <ariele@broadcom.com>
CC: Maciej Zenczykowski <maze@google.com>
CC: Jesse Gross <jesse@nicira.com>
Reported-by: Eric Dumazet <edumazet@google.com>
Tested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h

index 3f5cd7c..352e58e 100644 (file)
@@ -3464,30 +3464,28 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
                                      u16 *global_data,
                                      u32 xmit_type)
 {
-       u16 inner_hlen_w = 0;
+       u16 hlen_w = 0;
        u8 outerip_off, outerip_len = 0;
-
-       /* IP len */
-       inner_hlen_w = (skb_inner_transport_header(skb) -
-                       skb_inner_network_header(skb)) >> 1;
+       /* from outer IP to transport */
+       hlen_w = (skb_inner_transport_header(skb) -
+                 skb_network_header(skb)) >> 1;
 
        /* transport len */
        if (xmit_type & XMIT_CSUM_TCP)
-               inner_hlen_w += inner_tcp_hdrlen(skb) >> 1;
+               hlen_w += inner_tcp_hdrlen(skb) >> 1;
        else
-               inner_hlen_w += sizeof(struct udphdr) >> 1;
+               hlen_w += sizeof(struct udphdr) >> 1;
 
-       pbd2->fw_ip_hdr_to_payload_w = inner_hlen_w;
+       pbd2->fw_ip_hdr_to_payload_w = hlen_w;
 
        if (xmit_type & XMIT_CSUM_ENC_V4) {
-               struct iphdr *iph = inner_ip_hdr(skb);
-
+               struct iphdr *iph = ip_hdr(skb);
                pbd2->fw_ip_csum_wo_len_flags_frag =
                        bswab16(csum_fold((~iph->check) -
                                          iph->tot_len - iph->frag_off));
        } else {
                pbd2->fw_ip_hdr_to_payload_w =
-                       inner_hlen_w - ((sizeof(struct ipv6hdr)) >> 1);
+                       hlen_w - ((sizeof(struct ipv6hdr)) >> 1);
        }
 
        pbd2->tcp_send_seq = bswab32(inner_tcp_hdr(skb)->seq);
@@ -3495,7 +3493,7 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
        pbd2->tcp_flags = pbd_tcp_flags(inner_tcp_hdr(skb));
 
        if (xmit_type & XMIT_GSO_V4) {
-               pbd2->hw_ip_id = bswab16(ip_hdr(skb)->id);
+               pbd2->hw_ip_id = bswab16(inner_ip_hdr(skb)->id);
 
                pbd_e2->data.tunnel_data.pseudo_csum =
                        bswab16(~csum_tcpudp_magic(
index 10b0748..2c6a2a6 100644 (file)
@@ -2962,6 +2962,7 @@ static unsigned long bnx2x_get_common_flags(struct bnx2x *bp,
                __set_bit(BNX2X_Q_FLG_ZERO_STATS, &flags);
 
        __set_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, &flags);
+       __set_bit(BNX2X_Q_FLG_TUN_INC_INNER_IP_ID, &flags);
 
 #ifdef BNX2X_STOP_ON_ERROR
        __set_bit(BNX2X_Q_FLG_TX_SEC, &flags);
index 5bdc1d6..32a9609 100644 (file)
@@ -4432,6 +4432,8 @@ static void bnx2x_q_fill_init_tx_data(struct bnx2x_queue_sp_obj *o,
        tx_data->force_default_pri_flg =
                test_bit(BNX2X_Q_FLG_FORCE_DEFAULT_PRI, flags);
 
+       tx_data->tunnel_lso_inc_ip_id =
+               test_bit(BNX2X_Q_FLG_TUN_INC_INNER_IP_ID, flags);
        tx_data->tunnel_non_lso_pcsum_location =
                test_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, flags) ? PCSUM_ON_PKT :
                                                                  PCSUM_ON_BD;
index 35479da..43c00bc 100644 (file)
@@ -828,7 +828,8 @@ enum {
        BNX2X_Q_FLG_ANTI_SPOOF,
        BNX2X_Q_FLG_SILENT_VLAN_REM,
        BNX2X_Q_FLG_FORCE_DEFAULT_PRI,
-       BNX2X_Q_FLG_PCSUM_ON_PKT
+       BNX2X_Q_FLG_PCSUM_ON_PKT,
+       BNX2X_Q_FLG_TUN_INC_INNER_IP_ID
 };
 
 /* Queue type options: queue type may be a compination of below. */