xref: /openbmc/linux/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
144fd1c1fSVinay Kumar Yadav /* SPDX-License-Identifier: GPL-2.0-only */
244fd1c1fSVinay Kumar Yadav /*
344fd1c1fSVinay Kumar Yadav  * Copyright (c) 2018 Chelsio Communications, Inc.
444fd1c1fSVinay Kumar Yadav  */
544fd1c1fSVinay Kumar Yadav 
644fd1c1fSVinay Kumar Yadav #ifndef __CHTLS_H__
744fd1c1fSVinay Kumar Yadav #define __CHTLS_H__
844fd1c1fSVinay Kumar Yadav 
944fd1c1fSVinay Kumar Yadav #include <crypto/aes.h>
1044fd1c1fSVinay Kumar Yadav #include <crypto/algapi.h>
1144fd1c1fSVinay Kumar Yadav #include <crypto/hash.h>
12a24d22b2SEric Biggers #include <crypto/sha1.h>
13a24d22b2SEric Biggers #include <crypto/sha2.h>
1444fd1c1fSVinay Kumar Yadav #include <crypto/authenc.h>
1544fd1c1fSVinay Kumar Yadav #include <crypto/ctr.h>
1644fd1c1fSVinay Kumar Yadav #include <crypto/gf128mul.h>
1744fd1c1fSVinay Kumar Yadav #include <crypto/internal/aead.h>
1844fd1c1fSVinay Kumar Yadav #include <crypto/null.h>
1944fd1c1fSVinay Kumar Yadav #include <crypto/internal/skcipher.h>
2044fd1c1fSVinay Kumar Yadav #include <crypto/aead.h>
2144fd1c1fSVinay Kumar Yadav #include <crypto/scatterwalk.h>
2244fd1c1fSVinay Kumar Yadav #include <crypto/internal/hash.h>
2344fd1c1fSVinay Kumar Yadav #include <linux/tls.h>
2444fd1c1fSVinay Kumar Yadav #include <net/tls.h>
25*6a7eccefSChuck Lever #include <net/tls_prot.h>
2644fd1c1fSVinay Kumar Yadav #include <net/tls_toe.h>
2744fd1c1fSVinay Kumar Yadav 
2844fd1c1fSVinay Kumar Yadav #include "t4fw_api.h"
2944fd1c1fSVinay Kumar Yadav #include "t4_msg.h"
3044fd1c1fSVinay Kumar Yadav #include "cxgb4.h"
3144fd1c1fSVinay Kumar Yadav #include "cxgb4_uld.h"
3244fd1c1fSVinay Kumar Yadav #include "l2t.h"
3344fd1c1fSVinay Kumar Yadav #include "chcr_algo.h"
3444fd1c1fSVinay Kumar Yadav #include "chcr_core.h"
3544fd1c1fSVinay Kumar Yadav #include "chcr_crypto.h"
3644fd1c1fSVinay Kumar Yadav 
3744fd1c1fSVinay Kumar Yadav #define CHTLS_DRV_VERSION "1.0.0.0-ko"
3844fd1c1fSVinay Kumar Yadav 
3944fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXFLIT_CNT_S 24
4044fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXFLIT_CNT_V(x) ((x) << TLS_KEYCTX_RXFLIT_CNT_S)
4144fd1c1fSVinay Kumar Yadav 
4244fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXPROT_VER_S 20
4344fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXPROT_VER_M 0xf
4444fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXPROT_VER_V(x) ((x) << TLS_KEYCTX_RXPROT_VER_S)
4544fd1c1fSVinay Kumar Yadav 
4644fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCIPH_MODE_S 16
4744fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCIPH_MODE_M 0xf
4844fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCIPH_MODE_V(x) ((x) << TLS_KEYCTX_RXCIPH_MODE_S)
4944fd1c1fSVinay Kumar Yadav 
5044fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXAUTH_MODE_S 12
5144fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXAUTH_MODE_M 0xf
5244fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXAUTH_MODE_V(x) ((x) << TLS_KEYCTX_RXAUTH_MODE_S)
5344fd1c1fSVinay Kumar Yadav 
5444fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCIAU_CTRL_S 11
5544fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCIAU_CTRL_V(x) ((x) << TLS_KEYCTX_RXCIAU_CTRL_S)
5644fd1c1fSVinay Kumar Yadav 
5744fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RX_SEQCTR_S 9
5844fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RX_SEQCTR_M 0x3
5944fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RX_SEQCTR_V(x) ((x) << TLS_KEYCTX_RX_SEQCTR_S)
6044fd1c1fSVinay Kumar Yadav 
6144fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RX_VALID_S 8
6244fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RX_VALID_V(x) ((x) << TLS_KEYCTX_RX_VALID_S)
6344fd1c1fSVinay Kumar Yadav 
6444fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCK_SIZE_S 3
6544fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCK_SIZE_M 0x7
6644fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXCK_SIZE_V(x) ((x) << TLS_KEYCTX_RXCK_SIZE_S)
6744fd1c1fSVinay Kumar Yadav 
6844fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXMK_SIZE_S 0
6944fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXMK_SIZE_M 0x7
7044fd1c1fSVinay Kumar Yadav #define TLS_KEYCTX_RXMK_SIZE_V(x) ((x) << TLS_KEYCTX_RXMK_SIZE_S)
7144fd1c1fSVinay Kumar Yadav 
7244fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_IV_S  55
7344fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_IV_M  0x1ffULL
7444fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_IV_V(x) ((x) << KEYCTX_TX_WR_IV_S)
7544fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_IV_G(x) \
7644fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_IV_S) & KEYCTX_TX_WR_IV_M)
7744fd1c1fSVinay Kumar Yadav 
7844fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AAD_S 47
7944fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AAD_M 0xffULL
8044fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AAD_V(x) ((x) << KEYCTX_TX_WR_AAD_S)
8144fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AAD_G(x) (((x) >> KEYCTX_TX_WR_AAD_S) & \
8244fd1c1fSVinay Kumar Yadav 				KEYCTX_TX_WR_AAD_M)
8344fd1c1fSVinay Kumar Yadav 
8444fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AADST_S 39
8544fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AADST_M 0xffULL
8644fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AADST_V(x) ((x) << KEYCTX_TX_WR_AADST_S)
8744fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AADST_G(x) \
8844fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_AADST_S) & KEYCTX_TX_WR_AADST_M)
8944fd1c1fSVinay Kumar Yadav 
9044fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHER_S 30
9144fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHER_M 0x1ffULL
9244fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHER_V(x) ((x) << KEYCTX_TX_WR_CIPHER_S)
9344fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHER_G(x) \
9444fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_CIPHER_S) & KEYCTX_TX_WR_CIPHER_M)
9544fd1c1fSVinay Kumar Yadav 
9644fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHERST_S 23
9744fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHERST_M 0x7f
9844fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHERST_V(x) ((x) << KEYCTX_TX_WR_CIPHERST_S)
9944fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_CIPHERST_G(x) \
10044fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_CIPHERST_S) & KEYCTX_TX_WR_CIPHERST_M)
10144fd1c1fSVinay Kumar Yadav 
10244fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTH_S 14
10344fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTH_M 0x1ff
10444fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTH_V(x) ((x) << KEYCTX_TX_WR_AUTH_S)
10544fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTH_G(x) \
10644fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_AUTH_S) & KEYCTX_TX_WR_AUTH_M)
10744fd1c1fSVinay Kumar Yadav 
10844fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHST_S 7
10944fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHST_M 0x7f
11044fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHST_V(x) ((x) << KEYCTX_TX_WR_AUTHST_S)
11144fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHST_G(x) \
11244fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_AUTHST_S) & KEYCTX_TX_WR_AUTHST_M)
11344fd1c1fSVinay Kumar Yadav 
11444fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHIN_S 0
11544fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHIN_M 0x7f
11644fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHIN_V(x) ((x) << KEYCTX_TX_WR_AUTHIN_S)
11744fd1c1fSVinay Kumar Yadav #define KEYCTX_TX_WR_AUTHIN_G(x) \
11844fd1c1fSVinay Kumar Yadav 	(((x) >> KEYCTX_TX_WR_AUTHIN_S) & KEYCTX_TX_WR_AUTHIN_M)
11944fd1c1fSVinay Kumar Yadav 
12044fd1c1fSVinay Kumar Yadav struct sge_opaque_hdr {
12144fd1c1fSVinay Kumar Yadav 	void *dev;
12244fd1c1fSVinay Kumar Yadav 	dma_addr_t addr[MAX_SKB_FRAGS + 1];
12344fd1c1fSVinay Kumar Yadav };
12444fd1c1fSVinay Kumar Yadav 
12544fd1c1fSVinay Kumar Yadav #define MAX_IVS_PAGE			256
12644fd1c1fSVinay Kumar Yadav #define TLS_KEY_CONTEXT_SZ		64
12744fd1c1fSVinay Kumar Yadav #define CIPHER_BLOCK_SIZE		16
12844fd1c1fSVinay Kumar Yadav #define GCM_TAG_SIZE			16
12944fd1c1fSVinay Kumar Yadav #define KEY_ON_MEM_SZ			16
13044fd1c1fSVinay Kumar Yadav #define AEAD_EXPLICIT_DATA_SIZE		8
13144fd1c1fSVinay Kumar Yadav #define TLS_HEADER_LENGTH		5
13244fd1c1fSVinay Kumar Yadav #define SCMD_CIPH_MODE_AES_GCM		2
13344fd1c1fSVinay Kumar Yadav /* Any MFS size should work and come from openssl */
13444fd1c1fSVinay Kumar Yadav #define TLS_MFS				16384
13544fd1c1fSVinay Kumar Yadav 
13644fd1c1fSVinay Kumar Yadav #define RSS_HDR sizeof(struct rss_header)
13744fd1c1fSVinay Kumar Yadav #define TLS_WR_CPL_LEN \
13844fd1c1fSVinay Kumar Yadav 	(sizeof(struct fw_tlstx_data_wr) + sizeof(struct cpl_tx_tls_sfo))
13944fd1c1fSVinay Kumar Yadav 
14044fd1c1fSVinay Kumar Yadav enum {
14144fd1c1fSVinay Kumar Yadav 	CHTLS_KEY_CONTEXT_DSGL,
14244fd1c1fSVinay Kumar Yadav 	CHTLS_KEY_CONTEXT_IMM,
14344fd1c1fSVinay Kumar Yadav 	CHTLS_KEY_CONTEXT_DDR,
14444fd1c1fSVinay Kumar Yadav };
14544fd1c1fSVinay Kumar Yadav 
14644fd1c1fSVinay Kumar Yadav enum {
14744fd1c1fSVinay Kumar Yadav 	CHTLS_LISTEN_START,
14844fd1c1fSVinay Kumar Yadav 	CHTLS_LISTEN_STOP,
14944fd1c1fSVinay Kumar Yadav };
15044fd1c1fSVinay Kumar Yadav 
15144fd1c1fSVinay Kumar Yadav /* Flags for return value of CPL message handlers */
15244fd1c1fSVinay Kumar Yadav enum {
15344fd1c1fSVinay Kumar Yadav 	CPL_RET_BUF_DONE =    1,   /* buffer processing done */
15444fd1c1fSVinay Kumar Yadav 	CPL_RET_BAD_MSG =     2,   /* bad CPL message */
15544fd1c1fSVinay Kumar Yadav 	CPL_RET_UNKNOWN_TID = 4    /* unexpected unknown TID */
15644fd1c1fSVinay Kumar Yadav };
15744fd1c1fSVinay Kumar Yadav 
15844fd1c1fSVinay Kumar Yadav #define LISTEN_INFO_HASH_SIZE 32
15944fd1c1fSVinay Kumar Yadav #define RSPQ_HASH_BITS 5
16044fd1c1fSVinay Kumar Yadav struct listen_info {
16144fd1c1fSVinay Kumar Yadav 	struct listen_info *next;  /* Link to next entry */
16244fd1c1fSVinay Kumar Yadav 	struct sock *sk;           /* The listening socket */
16344fd1c1fSVinay Kumar Yadav 	unsigned int stid;         /* The server TID */
16444fd1c1fSVinay Kumar Yadav };
16544fd1c1fSVinay Kumar Yadav 
16644fd1c1fSVinay Kumar Yadav enum {
16744fd1c1fSVinay Kumar Yadav 	T4_LISTEN_START_PENDING,
16844fd1c1fSVinay Kumar Yadav 	T4_LISTEN_STARTED
16944fd1c1fSVinay Kumar Yadav };
17044fd1c1fSVinay Kumar Yadav 
17144fd1c1fSVinay Kumar Yadav enum csk_flags {
17244fd1c1fSVinay Kumar Yadav 	CSK_CALLBACKS_CHKD,	/* socket callbacks have been sanitized */
17344fd1c1fSVinay Kumar Yadav 	CSK_ABORT_REQ_RCVD,	/* received one ABORT_REQ_RSS message */
17444fd1c1fSVinay Kumar Yadav 	CSK_TX_MORE_DATA,	/* sending ULP data; don't set SHOVE bit */
17544fd1c1fSVinay Kumar Yadav 	CSK_TX_WAIT_IDLE,	/* suspend Tx until in-flight data is ACKed */
17644fd1c1fSVinay Kumar Yadav 	CSK_ABORT_SHUTDOWN,	/* shouldn't send more abort requests */
17744fd1c1fSVinay Kumar Yadav 	CSK_ABORT_RPL_PENDING,	/* expecting an abort reply */
17844fd1c1fSVinay Kumar Yadav 	CSK_CLOSE_CON_REQUESTED,/* we've sent a close_conn_req */
17944fd1c1fSVinay Kumar Yadav 	CSK_TX_DATA_SENT,	/* sent a TX_DATA WR on this connection */
18044fd1c1fSVinay Kumar Yadav 	CSK_TX_FAILOVER,	/* Tx traffic failing over */
18144fd1c1fSVinay Kumar Yadav 	CSK_UPDATE_RCV_WND,	/* Need to update rcv window */
18244fd1c1fSVinay Kumar Yadav 	CSK_RST_ABORTED,	/* outgoing RST was aborted */
18344fd1c1fSVinay Kumar Yadav 	CSK_TLS_HANDSHK,	/* TLS Handshake */
18444fd1c1fSVinay Kumar Yadav 	CSK_CONN_INLINE,	/* Connection on HW */
18544fd1c1fSVinay Kumar Yadav };
18644fd1c1fSVinay Kumar Yadav 
18744fd1c1fSVinay Kumar Yadav enum chtls_cdev_state {
18844fd1c1fSVinay Kumar Yadav 	CHTLS_CDEV_STATE_UP = 1
18944fd1c1fSVinay Kumar Yadav };
19044fd1c1fSVinay Kumar Yadav 
19144fd1c1fSVinay Kumar Yadav struct listen_ctx {
19244fd1c1fSVinay Kumar Yadav 	struct sock *lsk;
19344fd1c1fSVinay Kumar Yadav 	struct chtls_dev *cdev;
19444fd1c1fSVinay Kumar Yadav 	struct sk_buff_head synq;
19544fd1c1fSVinay Kumar Yadav 	u32 state;
19644fd1c1fSVinay Kumar Yadav };
19744fd1c1fSVinay Kumar Yadav 
19844fd1c1fSVinay Kumar Yadav struct key_map {
19944fd1c1fSVinay Kumar Yadav 	unsigned long *addr;
20044fd1c1fSVinay Kumar Yadav 	unsigned int start;
20144fd1c1fSVinay Kumar Yadav 	unsigned int available;
20244fd1c1fSVinay Kumar Yadav 	unsigned int size;
20344fd1c1fSVinay Kumar Yadav 	spinlock_t lock; /* lock for key id request from map */
20444fd1c1fSVinay Kumar Yadav } __packed;
20544fd1c1fSVinay Kumar Yadav 
20644fd1c1fSVinay Kumar Yadav struct tls_scmd {
20744fd1c1fSVinay Kumar Yadav 	u32 seqno_numivs;
20844fd1c1fSVinay Kumar Yadav 	u32 ivgen_hdrlen;
20944fd1c1fSVinay Kumar Yadav };
21044fd1c1fSVinay Kumar Yadav 
21144fd1c1fSVinay Kumar Yadav struct chtls_dev {
21244fd1c1fSVinay Kumar Yadav 	struct tls_toe_device tlsdev;
21344fd1c1fSVinay Kumar Yadav 	struct list_head list;
21444fd1c1fSVinay Kumar Yadav 	struct cxgb4_lld_info *lldi;
21544fd1c1fSVinay Kumar Yadav 	struct pci_dev *pdev;
21644fd1c1fSVinay Kumar Yadav 	struct listen_info *listen_hash_tab[LISTEN_INFO_HASH_SIZE];
21744fd1c1fSVinay Kumar Yadav 	spinlock_t listen_lock; /* lock for listen list */
21844fd1c1fSVinay Kumar Yadav 	struct net_device **ports;
21944fd1c1fSVinay Kumar Yadav 	struct tid_info *tids;
22044fd1c1fSVinay Kumar Yadav 	unsigned int pfvf;
22144fd1c1fSVinay Kumar Yadav 	const unsigned short *mtus;
22244fd1c1fSVinay Kumar Yadav 
22344fd1c1fSVinay Kumar Yadav 	struct idr hwtid_idr;
22444fd1c1fSVinay Kumar Yadav 	struct idr stid_idr;
22544fd1c1fSVinay Kumar Yadav 
22644fd1c1fSVinay Kumar Yadav 	spinlock_t idr_lock ____cacheline_aligned_in_smp;
22744fd1c1fSVinay Kumar Yadav 
22844fd1c1fSVinay Kumar Yadav 	struct net_device *egr_dev[NCHAN * 2];
22944fd1c1fSVinay Kumar Yadav 	struct sk_buff *rspq_skb_cache[1 << RSPQ_HASH_BITS];
23044fd1c1fSVinay Kumar Yadav 	struct sk_buff *askb;
23144fd1c1fSVinay Kumar Yadav 
23244fd1c1fSVinay Kumar Yadav 	struct sk_buff_head deferq;
23344fd1c1fSVinay Kumar Yadav 	struct work_struct deferq_task;
23444fd1c1fSVinay Kumar Yadav 
23544fd1c1fSVinay Kumar Yadav 	struct list_head list_node;
23644fd1c1fSVinay Kumar Yadav 	struct list_head rcu_node;
23744fd1c1fSVinay Kumar Yadav 	struct list_head na_node;
23844fd1c1fSVinay Kumar Yadav 	unsigned int send_page_order;
23944fd1c1fSVinay Kumar Yadav 	int max_host_sndbuf;
240a74e44a1SVinay Kumar Yadav 	u32 round_robin_cnt;
24144fd1c1fSVinay Kumar Yadav 	struct key_map kmap;
24244fd1c1fSVinay Kumar Yadav 	unsigned int cdev_state;
24344fd1c1fSVinay Kumar Yadav };
24444fd1c1fSVinay Kumar Yadav 
24544fd1c1fSVinay Kumar Yadav struct chtls_listen {
24644fd1c1fSVinay Kumar Yadav 	struct chtls_dev *cdev;
24744fd1c1fSVinay Kumar Yadav 	struct sock *sk;
24844fd1c1fSVinay Kumar Yadav };
24944fd1c1fSVinay Kumar Yadav 
25044fd1c1fSVinay Kumar Yadav struct chtls_hws {
25144fd1c1fSVinay Kumar Yadav 	struct sk_buff_head sk_recv_queue;
25244fd1c1fSVinay Kumar Yadav 	u8 txqid;
25344fd1c1fSVinay Kumar Yadav 	u8 ofld;
25444fd1c1fSVinay Kumar Yadav 	u16 type;
25544fd1c1fSVinay Kumar Yadav 	u16 rstate;
25644fd1c1fSVinay Kumar Yadav 	u16 keyrpl;
25744fd1c1fSVinay Kumar Yadav 	u16 pldlen;
25844fd1c1fSVinay Kumar Yadav 	u16 rcvpld;
25944fd1c1fSVinay Kumar Yadav 	u16 compute;
26044fd1c1fSVinay Kumar Yadav 	u16 expansion;
26144fd1c1fSVinay Kumar Yadav 	u16 keylen;
26244fd1c1fSVinay Kumar Yadav 	u16 pdus;
26344fd1c1fSVinay Kumar Yadav 	u16 adjustlen;
26444fd1c1fSVinay Kumar Yadav 	u16 ivsize;
26544fd1c1fSVinay Kumar Yadav 	u16 txleft;
26644fd1c1fSVinay Kumar Yadav 	u32 mfs;
26744fd1c1fSVinay Kumar Yadav 	s32 txkey;
26844fd1c1fSVinay Kumar Yadav 	s32 rxkey;
26944fd1c1fSVinay Kumar Yadav 	u32 fcplenmax;
27044fd1c1fSVinay Kumar Yadav 	u32 copied_seq;
27144fd1c1fSVinay Kumar Yadav 	u64 tx_seq_no;
27244fd1c1fSVinay Kumar Yadav 	struct tls_scmd scmd;
27344fd1c1fSVinay Kumar Yadav 	union {
27444fd1c1fSVinay Kumar Yadav 		struct tls12_crypto_info_aes_gcm_128 aes_gcm_128;
27544fd1c1fSVinay Kumar Yadav 		struct tls12_crypto_info_aes_gcm_256 aes_gcm_256;
27644fd1c1fSVinay Kumar Yadav 	} crypto_info;
27744fd1c1fSVinay Kumar Yadav };
27844fd1c1fSVinay Kumar Yadav 
27944fd1c1fSVinay Kumar Yadav struct chtls_sock {
28044fd1c1fSVinay Kumar Yadav 	struct sock *sk;
28144fd1c1fSVinay Kumar Yadav 	struct chtls_dev *cdev;
28244fd1c1fSVinay Kumar Yadav 	struct l2t_entry *l2t_entry;    /* pointer to the L2T entry */
28344fd1c1fSVinay Kumar Yadav 	struct net_device *egress_dev;  /* TX_CHAN for act open retry */
28444fd1c1fSVinay Kumar Yadav 
28544fd1c1fSVinay Kumar Yadav 	struct sk_buff_head txq;
28644fd1c1fSVinay Kumar Yadav 	struct sk_buff *wr_skb_head;
28744fd1c1fSVinay Kumar Yadav 	struct sk_buff *wr_skb_tail;
28844fd1c1fSVinay Kumar Yadav 	struct sk_buff *ctrl_skb_cache;
28944fd1c1fSVinay Kumar Yadav 	struct sk_buff *txdata_skb_cache; /* abort path messages */
29044fd1c1fSVinay Kumar Yadav 	struct kref kref;
29144fd1c1fSVinay Kumar Yadav 	unsigned long flags;
29244fd1c1fSVinay Kumar Yadav 	u32 opt2;
29344fd1c1fSVinay Kumar Yadav 	u32 wr_credits;
29444fd1c1fSVinay Kumar Yadav 	u32 wr_unacked;
29544fd1c1fSVinay Kumar Yadav 	u32 wr_max_credits;
29644fd1c1fSVinay Kumar Yadav 	u32 wr_nondata;
29744fd1c1fSVinay Kumar Yadav 	u32 hwtid;               /* TCP Control Block ID */
29844fd1c1fSVinay Kumar Yadav 	u32 txq_idx;
29944fd1c1fSVinay Kumar Yadav 	u32 rss_qid;
30044fd1c1fSVinay Kumar Yadav 	u32 tid;
30144fd1c1fSVinay Kumar Yadav 	u32 idr;
30244fd1c1fSVinay Kumar Yadav 	u32 mss;
30344fd1c1fSVinay Kumar Yadav 	u32 ulp_mode;
30444fd1c1fSVinay Kumar Yadav 	u32 tx_chan;
30544fd1c1fSVinay Kumar Yadav 	u32 rx_chan;
30644fd1c1fSVinay Kumar Yadav 	u32 sndbuf;
30744fd1c1fSVinay Kumar Yadav 	u32 txplen_max;
30844fd1c1fSVinay Kumar Yadav 	u32 mtu_idx;           /* MTU table index */
30944fd1c1fSVinay Kumar Yadav 	u32 smac_idx;
31044fd1c1fSVinay Kumar Yadav 	u8 port_id;
31144fd1c1fSVinay Kumar Yadav 	u8 tos;
31244fd1c1fSVinay Kumar Yadav 	u16 resv2;
31344fd1c1fSVinay Kumar Yadav 	u32 delack_mode;
31444fd1c1fSVinay Kumar Yadav 	u32 delack_seq;
31544fd1c1fSVinay Kumar Yadav 	u32 snd_win;
31644fd1c1fSVinay Kumar Yadav 	u32 rcv_win;
31744fd1c1fSVinay Kumar Yadav 
31844fd1c1fSVinay Kumar Yadav 	void *passive_reap_next;        /* placeholder for passive */
31944fd1c1fSVinay Kumar Yadav 	struct chtls_hws tlshws;
32044fd1c1fSVinay Kumar Yadav 	struct synq {
32144fd1c1fSVinay Kumar Yadav 		struct sk_buff *next;
32244fd1c1fSVinay Kumar Yadav 		struct sk_buff *prev;
32344fd1c1fSVinay Kumar Yadav 	} synq;
32444fd1c1fSVinay Kumar Yadav 	struct listen_ctx *listen_ctx;
32544fd1c1fSVinay Kumar Yadav };
32644fd1c1fSVinay Kumar Yadav 
32744fd1c1fSVinay Kumar Yadav struct tls_hdr {
32844fd1c1fSVinay Kumar Yadav 	u8  type;
32944fd1c1fSVinay Kumar Yadav 	u16 version;
33044fd1c1fSVinay Kumar Yadav 	u16 length;
33144fd1c1fSVinay Kumar Yadav } __packed;
33244fd1c1fSVinay Kumar Yadav 
33344fd1c1fSVinay Kumar Yadav struct tlsrx_cmp_hdr {
33444fd1c1fSVinay Kumar Yadav 	u8  type;
33544fd1c1fSVinay Kumar Yadav 	u16 version;
33644fd1c1fSVinay Kumar Yadav 	u16 length;
33744fd1c1fSVinay Kumar Yadav 
33844fd1c1fSVinay Kumar Yadav 	u64 tls_seq;
33944fd1c1fSVinay Kumar Yadav 	u16 reserved1;
34044fd1c1fSVinay Kumar Yadav 	u8  res_to_mac_error;
34144fd1c1fSVinay Kumar Yadav } __packed;
34244fd1c1fSVinay Kumar Yadav 
34344fd1c1fSVinay Kumar Yadav /* res_to_mac_error fields */
34444fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_INT_ERROR_S   4
34544fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_INT_ERROR_M   0x1
34644fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_INT_ERROR_V(x) \
34744fd1c1fSVinay Kumar Yadav 	((x) << TLSRX_HDR_PKT_INT_ERROR_S)
34844fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_INT_ERROR_G(x) \
34944fd1c1fSVinay Kumar Yadav 	(((x) >> TLSRX_HDR_PKT_INT_ERROR_S) & TLSRX_HDR_PKT_INT_ERROR_M)
35044fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_INT_ERROR_F   TLSRX_HDR_PKT_INT_ERROR_V(1U)
35144fd1c1fSVinay Kumar Yadav 
35244fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_SPP_ERROR_S        3
35344fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_SPP_ERROR_M        0x1
35444fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_SPP_ERROR_V(x)     ((x) << TLSRX_HDR_PKT_SPP_ERROR)
35544fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_SPP_ERROR_G(x)     \
35644fd1c1fSVinay Kumar Yadav 	(((x) >> TLSRX_HDR_PKT_SPP_ERROR_S) & TLSRX_HDR_PKT_SPP_ERROR_M)
35744fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_SPP_ERROR_F        TLSRX_HDR_PKT_SPP_ERROR_V(1U)
35844fd1c1fSVinay Kumar Yadav 
35944fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_CCDX_ERROR_S       2
36044fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_CCDX_ERROR_M       0x1
36144fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_CCDX_ERROR_V(x)    ((x) << TLSRX_HDR_PKT_CCDX_ERROR_S)
36244fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_CCDX_ERROR_G(x)    \
36344fd1c1fSVinay Kumar Yadav 	(((x) >> TLSRX_HDR_PKT_CCDX_ERROR_S) & TLSRX_HDR_PKT_CCDX_ERROR_M)
36444fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_CCDX_ERROR_F       TLSRX_HDR_PKT_CCDX_ERROR_V(1U)
36544fd1c1fSVinay Kumar Yadav 
36644fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_PAD_ERROR_S        1
36744fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_PAD_ERROR_M        0x1
36844fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_PAD_ERROR_V(x)     ((x) << TLSRX_HDR_PKT_PAD_ERROR_S)
36944fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_PAD_ERROR_G(x)     \
37044fd1c1fSVinay Kumar Yadav 	(((x) >> TLSRX_HDR_PKT_PAD_ERROR_S) & TLSRX_HDR_PKT_PAD_ERROR_M)
37144fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_PAD_ERROR_F        TLSRX_HDR_PKT_PAD_ERROR_V(1U)
37244fd1c1fSVinay Kumar Yadav 
37344fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_MAC_ERROR_S        0
37444fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_MAC_ERROR_M        0x1
37544fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_MAC_ERROR_V(x)     ((x) << TLSRX_HDR_PKT_MAC_ERROR)
37644fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_MAC_ERROR_G(x)     \
37744fd1c1fSVinay Kumar Yadav 	(((x) >> S_TLSRX_HDR_PKT_MAC_ERROR_S) & TLSRX_HDR_PKT_MAC_ERROR_M)
37844fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_MAC_ERROR_F        TLSRX_HDR_PKT_MAC_ERROR_V(1U)
37944fd1c1fSVinay Kumar Yadav 
38044fd1c1fSVinay Kumar Yadav #define TLSRX_HDR_PKT_ERROR_M           0x1F
38144fd1c1fSVinay Kumar Yadav #define CONTENT_TYPE_ERROR		0x7F
38244fd1c1fSVinay Kumar Yadav 
38344fd1c1fSVinay Kumar Yadav struct ulp_mem_rw {
38444fd1c1fSVinay Kumar Yadav 	__be32 cmd;
38544fd1c1fSVinay Kumar Yadav 	__be32 len16;             /* command length */
38644fd1c1fSVinay Kumar Yadav 	__be32 dlen;              /* data length in 32-byte units */
38744fd1c1fSVinay Kumar Yadav 	__be32 lock_addr;
38844fd1c1fSVinay Kumar Yadav };
38944fd1c1fSVinay Kumar Yadav 
39044fd1c1fSVinay Kumar Yadav struct tls_key_wr {
39144fd1c1fSVinay Kumar Yadav 	__be32 op_to_compl;
39244fd1c1fSVinay Kumar Yadav 	__be32 flowid_len16;
39344fd1c1fSVinay Kumar Yadav 	__be32 ftid;
39444fd1c1fSVinay Kumar Yadav 	u8   reneg_to_write_rx;
39544fd1c1fSVinay Kumar Yadav 	u8   protocol;
39644fd1c1fSVinay Kumar Yadav 	__be16 mfs;
39744fd1c1fSVinay Kumar Yadav };
39844fd1c1fSVinay Kumar Yadav 
39944fd1c1fSVinay Kumar Yadav struct tls_key_req {
40044fd1c1fSVinay Kumar Yadav 	struct tls_key_wr wr;
40144fd1c1fSVinay Kumar Yadav 	struct ulp_mem_rw req;
40244fd1c1fSVinay Kumar Yadav 	struct ulptx_idata sc_imm;
40344fd1c1fSVinay Kumar Yadav };
40444fd1c1fSVinay Kumar Yadav 
40544fd1c1fSVinay Kumar Yadav /*
40644fd1c1fSVinay Kumar Yadav  * This lives in skb->cb and is used to chain WRs in a linked list.
40744fd1c1fSVinay Kumar Yadav  */
40844fd1c1fSVinay Kumar Yadav struct wr_skb_cb {
40944fd1c1fSVinay Kumar Yadav 	struct l2t_skb_cb l2t;          /* reserve space for l2t CB */
41044fd1c1fSVinay Kumar Yadav 	struct sk_buff *next_wr;        /* next write request */
41144fd1c1fSVinay Kumar Yadav };
41244fd1c1fSVinay Kumar Yadav 
41344fd1c1fSVinay Kumar Yadav /* Per-skb backlog handler.  Run when a socket's backlog is processed. */
41444fd1c1fSVinay Kumar Yadav struct blog_skb_cb {
41544fd1c1fSVinay Kumar Yadav 	void (*backlog_rcv)(struct sock *sk, struct sk_buff *skb);
41644fd1c1fSVinay Kumar Yadav 	struct chtls_dev *cdev;
41744fd1c1fSVinay Kumar Yadav };
41844fd1c1fSVinay Kumar Yadav 
41944fd1c1fSVinay Kumar Yadav /*
42044fd1c1fSVinay Kumar Yadav  * Similar to tcp_skb_cb but with ULP elements added to support TLS,
42144fd1c1fSVinay Kumar Yadav  * etc.
42244fd1c1fSVinay Kumar Yadav  */
42344fd1c1fSVinay Kumar Yadav struct ulp_skb_cb {
42444fd1c1fSVinay Kumar Yadav 	struct wr_skb_cb wr;		/* reserve space for write request */
42544fd1c1fSVinay Kumar Yadav 	u16 flags;			/* TCP-like flags */
42644fd1c1fSVinay Kumar Yadav 	u8 psh;
42744fd1c1fSVinay Kumar Yadav 	u8 ulp_mode;			/* ULP mode/submode of sk_buff */
42844fd1c1fSVinay Kumar Yadav 	u32 seq;			/* TCP sequence number */
42944fd1c1fSVinay Kumar Yadav 	union { /* ULP-specific fields */
43044fd1c1fSVinay Kumar Yadav 		struct {
43144fd1c1fSVinay Kumar Yadav 			u8  type;
43244fd1c1fSVinay Kumar Yadav 			u8  ofld;
43344fd1c1fSVinay Kumar Yadav 			u8  iv;
43444fd1c1fSVinay Kumar Yadav 		} tls;
43544fd1c1fSVinay Kumar Yadav 	} ulp;
43644fd1c1fSVinay Kumar Yadav };
43744fd1c1fSVinay Kumar Yadav 
43844fd1c1fSVinay Kumar Yadav #define ULP_SKB_CB(skb) ((struct ulp_skb_cb *)&((skb)->cb[0]))
43944fd1c1fSVinay Kumar Yadav #define BLOG_SKB_CB(skb) ((struct blog_skb_cb *)(skb)->cb)
44044fd1c1fSVinay Kumar Yadav 
44144fd1c1fSVinay Kumar Yadav /*
44244fd1c1fSVinay Kumar Yadav  * Flags for ulp_skb_cb.flags.
44344fd1c1fSVinay Kumar Yadav  */
44444fd1c1fSVinay Kumar Yadav enum {
44544fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_NEED_HDR  = 1 << 0,	/* packet needs a TX_DATA_WR header */
44644fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_NO_APPEND = 1 << 1,	/* don't grow this skb */
44744fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_BARRIER   = 1 << 2,	/* set TX_WAIT_IDLE after sending */
44844fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_HOLD      = 1 << 3,	/* skb not ready for Tx yet */
44944fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_COMPL     = 1 << 4,	/* request WR completion */
45044fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_URG       = 1 << 5,	/* urgent data */
45144fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_TLS_HDR   = 1 << 6,  /* payload with tls hdr */
45244fd1c1fSVinay Kumar Yadav 	ULPCB_FLAG_NO_HDR    = 1 << 7,  /* not a ofld wr */
45344fd1c1fSVinay Kumar Yadav };
45444fd1c1fSVinay Kumar Yadav 
45544fd1c1fSVinay Kumar Yadav /* The ULP mode/submode of an skbuff */
45644fd1c1fSVinay Kumar Yadav #define skb_ulp_mode(skb)  (ULP_SKB_CB(skb)->ulp_mode)
45744fd1c1fSVinay Kumar Yadav #define TCP_PAGE(sk)   (sk->sk_frag.page)
45844fd1c1fSVinay Kumar Yadav #define TCP_OFF(sk)    (sk->sk_frag.offset)
45944fd1c1fSVinay Kumar Yadav 
to_chtls_dev(struct tls_toe_device * tlsdev)46044fd1c1fSVinay Kumar Yadav static inline struct chtls_dev *to_chtls_dev(struct tls_toe_device *tlsdev)
46144fd1c1fSVinay Kumar Yadav {
46244fd1c1fSVinay Kumar Yadav 	return container_of(tlsdev, struct chtls_dev, tlsdev);
46344fd1c1fSVinay Kumar Yadav }
46444fd1c1fSVinay Kumar Yadav 
csk_set_flag(struct chtls_sock * csk,enum csk_flags flag)46544fd1c1fSVinay Kumar Yadav static inline void csk_set_flag(struct chtls_sock *csk,
46644fd1c1fSVinay Kumar Yadav 				enum csk_flags flag)
46744fd1c1fSVinay Kumar Yadav {
46844fd1c1fSVinay Kumar Yadav 	__set_bit(flag, &csk->flags);
46944fd1c1fSVinay Kumar Yadav }
47044fd1c1fSVinay Kumar Yadav 
csk_reset_flag(struct chtls_sock * csk,enum csk_flags flag)47144fd1c1fSVinay Kumar Yadav static inline void csk_reset_flag(struct chtls_sock *csk,
47244fd1c1fSVinay Kumar Yadav 				  enum csk_flags flag)
47344fd1c1fSVinay Kumar Yadav {
47444fd1c1fSVinay Kumar Yadav 	__clear_bit(flag, &csk->flags);
47544fd1c1fSVinay Kumar Yadav }
47644fd1c1fSVinay Kumar Yadav 
csk_conn_inline(const struct chtls_sock * csk)47744fd1c1fSVinay Kumar Yadav static inline bool csk_conn_inline(const struct chtls_sock *csk)
47844fd1c1fSVinay Kumar Yadav {
47944fd1c1fSVinay Kumar Yadav 	return test_bit(CSK_CONN_INLINE, &csk->flags);
48044fd1c1fSVinay Kumar Yadav }
48144fd1c1fSVinay Kumar Yadav 
csk_flag(const struct sock * sk,enum csk_flags flag)48244fd1c1fSVinay Kumar Yadav static inline int csk_flag(const struct sock *sk, enum csk_flags flag)
48344fd1c1fSVinay Kumar Yadav {
48444fd1c1fSVinay Kumar Yadav 	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
48544fd1c1fSVinay Kumar Yadav 
48644fd1c1fSVinay Kumar Yadav 	if (!csk_conn_inline(csk))
48744fd1c1fSVinay Kumar Yadav 		return 0;
48844fd1c1fSVinay Kumar Yadav 	return test_bit(flag, &csk->flags);
48944fd1c1fSVinay Kumar Yadav }
49044fd1c1fSVinay Kumar Yadav 
csk_flag_nochk(const struct chtls_sock * csk,enum csk_flags flag)49144fd1c1fSVinay Kumar Yadav static inline int csk_flag_nochk(const struct chtls_sock *csk,
49244fd1c1fSVinay Kumar Yadav 				 enum csk_flags flag)
49344fd1c1fSVinay Kumar Yadav {
49444fd1c1fSVinay Kumar Yadav 	return test_bit(flag, &csk->flags);
49544fd1c1fSVinay Kumar Yadav }
49644fd1c1fSVinay Kumar Yadav 
cplhdr(struct sk_buff * skb)49744fd1c1fSVinay Kumar Yadav static inline void *cplhdr(struct sk_buff *skb)
49844fd1c1fSVinay Kumar Yadav {
49944fd1c1fSVinay Kumar Yadav 	return skb->data;
50044fd1c1fSVinay Kumar Yadav }
50144fd1c1fSVinay Kumar Yadav 
is_neg_adv(unsigned int status)50244fd1c1fSVinay Kumar Yadav static inline int is_neg_adv(unsigned int status)
50344fd1c1fSVinay Kumar Yadav {
50444fd1c1fSVinay Kumar Yadav 	return status == CPL_ERR_RTX_NEG_ADVICE ||
50544fd1c1fSVinay Kumar Yadav 	       status == CPL_ERR_KEEPALV_NEG_ADVICE ||
50644fd1c1fSVinay Kumar Yadav 	       status == CPL_ERR_PERSIST_NEG_ADVICE;
50744fd1c1fSVinay Kumar Yadav }
50844fd1c1fSVinay Kumar Yadav 
process_cpl_msg(void (* fn)(struct sock *,struct sk_buff *),struct sock * sk,struct sk_buff * skb)50944fd1c1fSVinay Kumar Yadav static inline void process_cpl_msg(void (*fn)(struct sock *, struct sk_buff *),
51044fd1c1fSVinay Kumar Yadav 				   struct sock *sk,
51144fd1c1fSVinay Kumar Yadav 				   struct sk_buff *skb)
51244fd1c1fSVinay Kumar Yadav {
51344fd1c1fSVinay Kumar Yadav 	skb_reset_mac_header(skb);
51444fd1c1fSVinay Kumar Yadav 	skb_reset_network_header(skb);
51544fd1c1fSVinay Kumar Yadav 	skb_reset_transport_header(skb);
51644fd1c1fSVinay Kumar Yadav 
51744fd1c1fSVinay Kumar Yadav 	bh_lock_sock(sk);
51844fd1c1fSVinay Kumar Yadav 	if (unlikely(sock_owned_by_user(sk))) {
51944fd1c1fSVinay Kumar Yadav 		BLOG_SKB_CB(skb)->backlog_rcv = fn;
52044fd1c1fSVinay Kumar Yadav 		__sk_add_backlog(sk, skb);
52144fd1c1fSVinay Kumar Yadav 	} else {
52244fd1c1fSVinay Kumar Yadav 		fn(sk, skb);
52344fd1c1fSVinay Kumar Yadav 	}
52444fd1c1fSVinay Kumar Yadav 	bh_unlock_sock(sk);
52544fd1c1fSVinay Kumar Yadav }
52644fd1c1fSVinay Kumar Yadav 
chtls_sock_free(struct kref * ref)52744fd1c1fSVinay Kumar Yadav static inline void chtls_sock_free(struct kref *ref)
52844fd1c1fSVinay Kumar Yadav {
52944fd1c1fSVinay Kumar Yadav 	struct chtls_sock *csk = container_of(ref, struct chtls_sock,
53044fd1c1fSVinay Kumar Yadav 					      kref);
53144fd1c1fSVinay Kumar Yadav 	kfree(csk);
53244fd1c1fSVinay Kumar Yadav }
53344fd1c1fSVinay Kumar Yadav 
__chtls_sock_put(const char * fn,struct chtls_sock * csk)53444fd1c1fSVinay Kumar Yadav static inline void __chtls_sock_put(const char *fn, struct chtls_sock *csk)
53544fd1c1fSVinay Kumar Yadav {
53644fd1c1fSVinay Kumar Yadav 	kref_put(&csk->kref, chtls_sock_free);
53744fd1c1fSVinay Kumar Yadav }
53844fd1c1fSVinay Kumar Yadav 
__chtls_sock_get(const char * fn,struct chtls_sock * csk)53944fd1c1fSVinay Kumar Yadav static inline void __chtls_sock_get(const char *fn,
54044fd1c1fSVinay Kumar Yadav 				    struct chtls_sock *csk)
54144fd1c1fSVinay Kumar Yadav {
54244fd1c1fSVinay Kumar Yadav 	kref_get(&csk->kref);
54344fd1c1fSVinay Kumar Yadav }
54444fd1c1fSVinay Kumar Yadav 
send_or_defer(struct sock * sk,struct tcp_sock * tp,struct sk_buff * skb,int through_l2t)54544fd1c1fSVinay Kumar Yadav static inline void send_or_defer(struct sock *sk, struct tcp_sock *tp,
54644fd1c1fSVinay Kumar Yadav 				 struct sk_buff *skb, int through_l2t)
54744fd1c1fSVinay Kumar Yadav {
54844fd1c1fSVinay Kumar Yadav 	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
54944fd1c1fSVinay Kumar Yadav 
55044fd1c1fSVinay Kumar Yadav 	if (through_l2t) {
55144fd1c1fSVinay Kumar Yadav 		/* send through L2T */
55244fd1c1fSVinay Kumar Yadav 		cxgb4_l2t_send(csk->egress_dev, skb, csk->l2t_entry);
55344fd1c1fSVinay Kumar Yadav 	} else {
55444fd1c1fSVinay Kumar Yadav 		/* send directly */
55544fd1c1fSVinay Kumar Yadav 		cxgb4_ofld_send(csk->egress_dev, skb);
55644fd1c1fSVinay Kumar Yadav 	}
55744fd1c1fSVinay Kumar Yadav }
55844fd1c1fSVinay Kumar Yadav 
55944fd1c1fSVinay Kumar Yadav typedef int (*chtls_handler_func)(struct chtls_dev *, struct sk_buff *);
56044fd1c1fSVinay Kumar Yadav extern chtls_handler_func chtls_handlers[NUM_CPL_CMDS];
56144fd1c1fSVinay Kumar Yadav void chtls_install_cpl_ops(struct sock *sk);
56244fd1c1fSVinay Kumar Yadav int chtls_init_kmap(struct chtls_dev *cdev, struct cxgb4_lld_info *lldi);
56344fd1c1fSVinay Kumar Yadav void chtls_listen_stop(struct chtls_dev *cdev, struct sock *sk);
56444fd1c1fSVinay Kumar Yadav int chtls_listen_start(struct chtls_dev *cdev, struct sock *sk);
56544fd1c1fSVinay Kumar Yadav void chtls_close(struct sock *sk, long timeout);
56644fd1c1fSVinay Kumar Yadav int chtls_disconnect(struct sock *sk, int flags);
56744fd1c1fSVinay Kumar Yadav void chtls_shutdown(struct sock *sk, int how);
56844fd1c1fSVinay Kumar Yadav void chtls_destroy_sock(struct sock *sk);
56944fd1c1fSVinay Kumar Yadav int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
57044fd1c1fSVinay Kumar Yadav int chtls_recvmsg(struct sock *sk, struct msghdr *msg,
571ec095263SOliver Hartkopp 		  size_t len, int flags, int *addr_len);
572c289a160SDavid Howells void chtls_splice_eof(struct socket *sock);
57344fd1c1fSVinay Kumar Yadav int send_tx_flowc_wr(struct sock *sk, int compl,
57444fd1c1fSVinay Kumar Yadav 		     u32 snd_nxt, u32 rcv_nxt);
57544fd1c1fSVinay Kumar Yadav void chtls_tcp_push(struct sock *sk, int flags);
57644fd1c1fSVinay Kumar Yadav int chtls_push_frames(struct chtls_sock *csk, int comp);
57744fd1c1fSVinay Kumar Yadav int chtls_set_tcb_tflag(struct sock *sk, unsigned int bit_pos, int val);
5788ad2a970SAyush Sawal void chtls_set_tcb_field_rpl_skb(struct sock *sk, u16 word,
5798ad2a970SAyush Sawal 				 u64 mask, u64 val, u8 cookie,
5808ad2a970SAyush Sawal 				 int through_l2t);
58144fd1c1fSVinay Kumar Yadav int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 mode, int cipher_type);
5828ad2a970SAyush Sawal void chtls_set_quiesce_ctrl(struct sock *sk, int val);
58344fd1c1fSVinay Kumar Yadav void skb_entail(struct sock *sk, struct sk_buff *skb, int flags);
58444fd1c1fSVinay Kumar Yadav unsigned int keyid_to_addr(int start_addr, int keyid);
58544fd1c1fSVinay Kumar Yadav void free_tls_keyid(struct sock *sk);
58644fd1c1fSVinay Kumar Yadav #endif
587