|
Thomas Bogendoerfer |
a5d516 |
From: Rohit Maheshwari <rohitm@chelsio.com>
|
|
Thomas Bogendoerfer |
a5d516 |
Date: Mon, 9 Nov 2020 16:21:32 +0530
|
|
Thomas Bogendoerfer |
a5d516 |
Subject: ch_ktls: Correction in finding correct length
|
|
Thomas Bogendoerfer |
a5d516 |
Patch-mainline: v5.10-rc4
|
|
Thomas Bogendoerfer |
a5d516 |
Git-commit: b1b5cb18032b37ab69b23a461eb8be1a44fcfc3b
|
|
Thomas Bogendoerfer |
a5d516 |
References: jsc#SLE-15129
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
There is a possibility of linear skbs coming in. Correcting
|
|
Thomas Bogendoerfer |
a5d516 |
the length extraction logic.
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
v2->v3:
|
|
Thomas Bogendoerfer |
a5d516 |
- Separated un-related changes from this patch.
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling")
|
|
Thomas Bogendoerfer |
a5d516 |
Signed-off-by: Rohit Maheshwari <rohitm@chelsio.com>
|
|
Thomas Bogendoerfer |
a5d516 |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Thomas Bogendoerfer |
a5d516 |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
a5d516 |
---
|
|
Thomas Bogendoerfer |
a5d516 |
drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c | 15 +++++-----
|
|
Thomas Bogendoerfer |
a5d516 |
1 file changed, 8 insertions(+), 7 deletions(-)
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
--- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
|
|
Thomas Bogendoerfer |
a5d516 |
+++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -967,7 +967,7 @@ chcr_ktls_write_tcp_options(struct chcr_
|
|
Thomas Bogendoerfer |
a5d516 |
/* packet length = eth hdr len + ip hdr len + tcp hdr len
|
|
Thomas Bogendoerfer |
a5d516 |
* (including options).
|
|
Thomas Bogendoerfer |
a5d516 |
*/
|
|
Thomas Bogendoerfer |
a5d516 |
- pktlen = skb->len - skb->data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
+ pktlen = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
ctrl = sizeof(*cpl) + pktlen;
|
|
Thomas Bogendoerfer |
a5d516 |
len16 = DIV_ROUND_UP(sizeof(*wr) + ctrl, 16);
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -1860,6 +1860,7 @@ out:
|
|
Thomas Bogendoerfer |
a5d516 |
/* nic tls TX handler */
|
|
Thomas Bogendoerfer |
a5d516 |
static int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
Thomas Bogendoerfer |
a5d516 |
{
|
|
Thomas Bogendoerfer |
a5d516 |
+ u32 tls_end_offset, tcp_seq, skb_data_len, skb_offset;
|
|
Thomas Bogendoerfer |
a5d516 |
struct ch_ktls_port_stats_debug *port_stats;
|
|
Thomas Bogendoerfer |
a5d516 |
struct chcr_ktls_ofld_ctx_tx *tx_ctx;
|
|
Thomas Bogendoerfer |
a5d516 |
struct ch_ktls_stats_debug *stats;
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -1867,7 +1868,6 @@ static int chcr_ktls_xmit(struct sk_buff
|
|
Thomas Bogendoerfer |
a5d516 |
int data_len, qidx, ret = 0, mss;
|
|
Thomas Bogendoerfer |
a5d516 |
struct tls_record_info *record;
|
|
Thomas Bogendoerfer |
a5d516 |
struct chcr_ktls_info *tx_info;
|
|
Thomas Bogendoerfer |
a5d516 |
- u32 tls_end_offset, tcp_seq;
|
|
Thomas Bogendoerfer |
a5d516 |
struct tls_context *tls_ctx;
|
|
Thomas Bogendoerfer |
a5d516 |
struct sk_buff *local_skb;
|
|
Thomas Bogendoerfer |
a5d516 |
struct sge_eth_txq *q;
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -1875,8 +1875,11 @@ static int chcr_ktls_xmit(struct sk_buff
|
|
Thomas Bogendoerfer |
a5d516 |
unsigned long flags;
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
tcp_seq = ntohl(th->seq);
|
|
Thomas Bogendoerfer |
a5d516 |
+ skb_offset = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
|
Thomas Bogendoerfer |
a5d516 |
+ skb_data_len = skb->len - skb_offset;
|
|
Thomas Bogendoerfer |
a5d516 |
+ data_len = skb_data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
- mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : skb->data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
+ mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
tls_ctx = tls_get_ctx(skb->sk);
|
|
Thomas Bogendoerfer |
a5d516 |
if (unlikely(tls_ctx->netdev != dev))
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -1922,8 +1925,6 @@ static int chcr_ktls_xmit(struct sk_buff
|
|
Thomas Bogendoerfer |
a5d516 |
/* copy skb contents into local skb */
|
|
Thomas Bogendoerfer |
a5d516 |
chcr_ktls_skb_copy(skb, local_skb);
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
- /* go through the skb and send only one record at a time. */
|
|
Thomas Bogendoerfer |
a5d516 |
- data_len = skb->data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
/* TCP segments can be in received either complete or partial.
|
|
Thomas Bogendoerfer |
a5d516 |
* chcr_end_part_handler will handle cases if complete record or end
|
|
Thomas Bogendoerfer |
a5d516 |
* part of the record is received. Incase of partial end part of record,
|
|
Thomas Bogendoerfer |
a5d516 |
@@ -2020,9 +2021,9 @@ clear_ref:
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
} while (data_len > 0);
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
- tx_info->prev_seq = ntohl(th->seq) + skb->data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
+ tx_info->prev_seq = ntohl(th->seq) + skb_data_len;
|
|
Thomas Bogendoerfer |
a5d516 |
atomic64_inc(&port_stats->ktls_tx_encrypted_packets);
|
|
Thomas Bogendoerfer |
a5d516 |
- atomic64_add(skb->data_len, &port_stats->ktls_tx_encrypted_bytes);
|
|
Thomas Bogendoerfer |
a5d516 |
+ atomic64_add(skb_data_len, &port_stats->ktls_tx_encrypted_bytes);
|
|
Thomas Bogendoerfer |
a5d516 |
|
|
Thomas Bogendoerfer |
a5d516 |
/* tcp finish is set, send a separate tcp msg including all the options
|
|
Thomas Bogendoerfer |
a5d516 |
* as well.
|