Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e287a75c authored by Dmitry Kravkov's avatar Dmitry Kravkov Committed by David S. Miller
Browse files

bnx2x: increase inner ip id during encapsulated tso



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: default avatarDmitry 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: default avatarEric Dumazet <edumazet@google.com>
Tested-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9d0ca6ed
Loading
Loading
Loading
Loading
+10 −12
Original line number Original line Diff line number Diff line
@@ -3464,30 +3464,28 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
				      u16 *global_data,
				      u16 *global_data,
				      u32 xmit_type)
				      u32 xmit_type)
{
{
	u16 inner_hlen_w = 0;
	u16 hlen_w = 0;
	u8 outerip_off, outerip_len = 0;
	u8 outerip_off, outerip_len = 0;

	/* from outer IP to transport */
	/* IP len */
	hlen_w = (skb_inner_transport_header(skb) -
	inner_hlen_w = (skb_inner_transport_header(skb) -
		  skb_network_header(skb)) >> 1;
			skb_inner_network_header(skb)) >> 1;


	/* transport len */
	/* transport len */
	if (xmit_type & XMIT_CSUM_TCP)
	if (xmit_type & XMIT_CSUM_TCP)
		inner_hlen_w += inner_tcp_hdrlen(skb) >> 1;
		hlen_w += inner_tcp_hdrlen(skb) >> 1;
	else
	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) {
	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 =
		pbd2->fw_ip_csum_wo_len_flags_frag =
			bswab16(csum_fold((~iph->check) -
			bswab16(csum_fold((~iph->check) -
					  iph->tot_len - iph->frag_off));
					  iph->tot_len - iph->frag_off));
	} else {
	} else {
		pbd2->fw_ip_hdr_to_payload_w =
		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);
	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));
	pbd2->tcp_flags = pbd_tcp_flags(inner_tcp_hdr(skb));


	if (xmit_type & XMIT_GSO_V4) {
	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 =
		pbd_e2->data.tunnel_data.pseudo_csum =
			bswab16(~csum_tcpudp_magic(
			bswab16(~csum_tcpudp_magic(
+1 −0
Original line number Original line Diff line number Diff line
@@ -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_ZERO_STATS, &flags);


	__set_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, &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
#ifdef BNX2X_STOP_ON_ERROR
	__set_bit(BNX2X_Q_FLG_TX_SEC, &flags);
	__set_bit(BNX2X_Q_FLG_TX_SEC, &flags);
+2 −0
Original line number Original line Diff line number Diff line
@@ -4432,6 +4432,8 @@ static void bnx2x_q_fill_init_tx_data(struct bnx2x_queue_sp_obj *o,
	tx_data->force_default_pri_flg =
	tx_data->force_default_pri_flg =
		test_bit(BNX2X_Q_FLG_FORCE_DEFAULT_PRI, flags);
		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 =
	tx_data->tunnel_non_lso_pcsum_location =
		test_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, flags) ? PCSUM_ON_PKT :
		test_bit(BNX2X_Q_FLG_PCSUM_ON_PKT, flags) ? PCSUM_ON_PKT :
								  PCSUM_ON_BD;
								  PCSUM_ON_BD;
+2 −1
Original line number Original line Diff line number Diff line
@@ -828,7 +828,8 @@ enum {
	BNX2X_Q_FLG_ANTI_SPOOF,
	BNX2X_Q_FLG_ANTI_SPOOF,
	BNX2X_Q_FLG_SILENT_VLAN_REM,
	BNX2X_Q_FLG_SILENT_VLAN_REM,
	BNX2X_Q_FLG_FORCE_DEFAULT_PRI,
	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. */
/* Queue type options: queue type may be a compination of below. */