Skip to content

Commit 17a7d24

Browse files
chelsiocryptoherbertx
authored andcommitted
crypto: chtls - generic handling of data and hdr
removed redundant check and made TLS PDU and header recv handling common as received from HW. Ensure that only tls header is read in cpl_rx_tls_cmp read-ahead and skb is freed when entire data is processed. Signed-off-by: Atul Gupta <atul.gupta@chelsio.com> Signed-off-by: Harsh Jain <harsh@chelsio.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 6ecc9d9 commit 17a7d24

File tree

3 files changed

+23
-53
lines changed

3 files changed

+23
-53
lines changed

drivers/crypto/chelsio/chtls/chtls.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,6 @@ enum {
6767
CPL_RET_UNKNOWN_TID = 4 /* unexpected unknown TID */
6868
};
6969

70-
#define TLS_RCV_ST_READ_HEADER 0xF0
71-
#define TLS_RCV_ST_READ_BODY 0xF1
72-
#define TLS_RCV_ST_READ_DONE 0xF2
73-
#define TLS_RCV_ST_READ_NB 0xF3
74-
7570
#define LISTEN_INFO_HASH_SIZE 32
7671
#define RSPQ_HASH_BITS 5
7772
struct listen_info {
@@ -278,6 +273,7 @@ struct tlsrx_cmp_hdr {
278273
#define TLSRX_HDR_PKT_MAC_ERROR_F TLSRX_HDR_PKT_MAC_ERROR_V(1U)
279274

280275
#define TLSRX_HDR_PKT_ERROR_M 0x1F
276+
#define CONTENT_TYPE_ERROR 0x7F
281277

282278
struct ulp_mem_rw {
283279
__be32 cmd;
@@ -347,8 +343,8 @@ enum {
347343
ULPCB_FLAG_HOLD = 1 << 3, /* skb not ready for Tx yet */
348344
ULPCB_FLAG_COMPL = 1 << 4, /* request WR completion */
349345
ULPCB_FLAG_URG = 1 << 5, /* urgent data */
350-
ULPCB_FLAG_TLS_ND = 1 << 6, /* payload of zero length */
351-
ULPCB_FLAG_NO_HDR = 1 << 7, /* not a ofld wr */
346+
ULPCB_FLAG_TLS_HDR = 1 << 6, /* payload with tls hdr */
347+
ULPCB_FLAG_NO_HDR = 1 << 7, /* not a ofld wr */
352348
};
353349

354350
/* The ULP mode/submode of an skbuff */

drivers/crypto/chelsio/chtls/chtls_cm.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,12 +1608,14 @@ static void chtls_set_hdrlen(struct sk_buff *skb, unsigned int nlen)
16081608

16091609
static void chtls_rx_hdr(struct sock *sk, struct sk_buff *skb)
16101610
{
1611-
struct cpl_rx_tls_cmp *cmp_cpl = cplhdr(skb);
1611+
struct tlsrx_cmp_hdr *tls_hdr_pkt;
1612+
struct cpl_rx_tls_cmp *cmp_cpl;
16121613
struct sk_buff *skb_rec;
16131614
struct chtls_sock *csk;
16141615
struct chtls_hws *tlsk;
16151616
struct tcp_sock *tp;
16161617

1618+
cmp_cpl = cplhdr(skb);
16171619
csk = rcu_dereference_sk_user_data(sk);
16181620
tlsk = &csk->tlshws;
16191621
tp = tcp_sk(sk);
@@ -1623,16 +1625,18 @@ static void chtls_rx_hdr(struct sock *sk, struct sk_buff *skb)
16231625

16241626
skb_reset_transport_header(skb);
16251627
__skb_pull(skb, sizeof(*cmp_cpl));
1628+
tls_hdr_pkt = (struct tlsrx_cmp_hdr *)skb->data;
1629+
if (tls_hdr_pkt->res_to_mac_error & TLSRX_HDR_PKT_ERROR_M)
1630+
tls_hdr_pkt->type = CONTENT_TYPE_ERROR;
16261631
if (!skb->data_len)
1627-
__skb_trim(skb, CPL_RX_TLS_CMP_LENGTH_G
1628-
(ntohl(cmp_cpl->pdulength_length)));
1632+
__skb_trim(skb, TLS_HEADER_LENGTH);
16291633

16301634
tp->rcv_nxt +=
16311635
CPL_RX_TLS_CMP_PDULENGTH_G(ntohl(cmp_cpl->pdulength_length));
16321636

1637+
ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_TLS_HDR;
16331638
skb_rec = __skb_dequeue(&tlsk->sk_recv_queue);
16341639
if (!skb_rec) {
1635-
ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_TLS_ND;
16361640
__skb_queue_tail(&sk->sk_receive_queue, skb);
16371641
} else {
16381642
chtls_set_hdrlen(skb, tlsk->pldlen);

drivers/crypto/chelsio/chtls/chtls_io.c

Lines changed: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,64 +1449,34 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
14491449
}
14501450
}
14511451
}
1452-
if (hws->rstate == TLS_RCV_ST_READ_BODY) {
1453-
if (skb_copy_datagram_msg(skb, offset,
1454-
msg, avail)) {
1455-
if (!copied) {
1456-
copied = -EFAULT;
1457-
break;
1458-
}
1459-
}
1460-
} else {
1461-
struct tlsrx_cmp_hdr *tls_hdr_pkt =
1462-
(struct tlsrx_cmp_hdr *)skb->data;
1463-
1464-
if ((tls_hdr_pkt->res_to_mac_error &
1465-
TLSRX_HDR_PKT_ERROR_M))
1466-
tls_hdr_pkt->type = 0x7F;
1467-
1468-
/* CMP pld len is for recv seq */
1469-
hws->rcvpld = skb->hdr_len;
1470-
if (skb_copy_datagram_msg(skb, offset, msg, avail)) {
1471-
if (!copied) {
1472-
copied = -EFAULT;
1473-
break;
1474-
}
1452+
if (skb_copy_datagram_msg(skb, offset, msg, avail)) {
1453+
if (!copied) {
1454+
copied = -EFAULT;
1455+
break;
14751456
}
14761457
}
1458+
14771459
copied += avail;
14781460
len -= avail;
14791461
hws->copied_seq += avail;
14801462
skip_copy:
14811463
if (tp->urg_data && after(tp->copied_seq, tp->urg_seq))
14821464
tp->urg_data = 0;
14831465

1484-
if (hws->rstate == TLS_RCV_ST_READ_BODY &&
1485-
(avail + offset) >= skb->len) {
1466+
if ((avail + offset) >= skb->len) {
14861467
if (likely(skb))
14871468
chtls_free_skb(sk, skb);
14881469
buffers_freed++;
1489-
hws->rstate = TLS_RCV_ST_READ_HEADER;
1490-
atomic_inc(&adap->chcr_stats.tls_pdu_rx);
1491-
tp->copied_seq += hws->rcvpld;
1470+
if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_TLS_HDR) {
1471+
tp->copied_seq += skb->len;
1472+
hws->rcvpld = skb->hdr_len;
1473+
} else {
1474+
tp->copied_seq += hws->rcvpld;
1475+
}
14921476
hws->copied_seq = 0;
14931477
if (copied >= target &&
14941478
!skb_peek(&sk->sk_receive_queue))
14951479
break;
1496-
} else {
1497-
if (likely(skb)) {
1498-
if (ULP_SKB_CB(skb)->flags &
1499-
ULPCB_FLAG_TLS_ND)
1500-
hws->rstate =
1501-
TLS_RCV_ST_READ_HEADER;
1502-
else
1503-
hws->rstate =
1504-
TLS_RCV_ST_READ_BODY;
1505-
chtls_free_skb(sk, skb);
1506-
}
1507-
buffers_freed++;
1508-
tp->copied_seq += avail;
1509-
hws->copied_seq = 0;
15101480
}
15111481
} while (len > 0);
15121482

0 commit comments

Comments
 (0)