| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* Copyright (C) 2020 Chelsio Communications. All rights reserved. */ |
| |
| #ifndef __CHCR_KTLS_H__ |
| #define __CHCR_KTLS_H__ |
| |
| #ifdef CONFIG_CHELSIO_TLS_DEVICE |
| #include <net/tls.h> |
| #include "cxgb4.h" |
| #include "t4_msg.h" |
| #include "t4_tcb.h" |
| #include "l2t.h" |
| #include "chcr_common.h" |
| #include "cxgb4_uld.h" |
| |
| #define CHCR_TCB_STATE_CLOSED 0 |
| #define CHCR_KTLS_KEY_CTX_LEN 16 |
| #define CHCR_SET_TCB_FIELD_LEN sizeof(struct cpl_set_tcb_field) |
| #define CHCR_PLAIN_TX_DATA_LEN (sizeof(struct fw_ulptx_wr) +\ |
| sizeof(struct ulp_txpkt) +\ |
| sizeof(struct ulptx_idata) +\ |
| sizeof(struct cpl_tx_data)) |
| |
| #define CHCR_KTLS_WR_SIZE (CHCR_PLAIN_TX_DATA_LEN +\ |
| sizeof(struct cpl_tx_sec_pdu)) |
| |
| enum chcr_ktls_conn_state { |
| KTLS_CONN_CLOSED, |
| KTLS_CONN_ACT_OPEN_REQ, |
| KTLS_CONN_ACT_OPEN_RPL, |
| KTLS_CONN_SET_TCB_REQ, |
| KTLS_CONN_SET_TCB_RPL, |
| KTLS_CONN_TX_READY, |
| }; |
| |
| struct chcr_ktls_info { |
| struct sock *sk; |
| spinlock_t lock; /* state machine lock */ |
| struct ktls_key_ctx key_ctx; |
| struct adapter *adap; |
| struct l2t_entry *l2te; |
| struct net_device *netdev; |
| u64 iv; |
| u64 record_no; |
| int tid; |
| int atid; |
| int rx_qid; |
| u32 iv_size; |
| u32 prev_seq; |
| u32 prev_ack; |
| u32 salt_size; |
| u32 key_ctx_len; |
| u32 scmd0_seqno_numivs; |
| u32 scmd0_ivgen_hdrlen; |
| u32 tcp_start_seq_number; |
| u32 scmd0_short_seqno_numivs; |
| u32 scmd0_short_ivgen_hdrlen; |
| enum chcr_ktls_conn_state connection_state; |
| u16 prev_win; |
| u8 tx_chan; |
| u8 smt_idx; |
| u8 port_id; |
| u8 ip_family; |
| u8 first_qset; |
| }; |
| |
| struct chcr_ktls_ofld_ctx_tx { |
| struct tls_offload_context_tx base; |
| struct chcr_ktls_info *chcr_info; |
| }; |
| |
| static inline struct chcr_ktls_ofld_ctx_tx * |
| chcr_get_ktls_tx_context(struct tls_context *tls_ctx) |
| { |
| BUILD_BUG_ON(sizeof(struct chcr_ktls_ofld_ctx_tx) > |
| TLS_OFFLOAD_CONTEXT_SIZE_TX); |
| return container_of(tls_offload_ctx_tx(tls_ctx), |
| struct chcr_ktls_ofld_ctx_tx, |
| base); |
| } |
| |
| static inline int chcr_get_first_rx_qid(struct adapter *adap) |
| { |
| /* u_ctx is saved in adap, fetch it */ |
| struct uld_ctx *u_ctx = adap->uld[CXGB4_ULD_CRYPTO].handle; |
| |
| if (!u_ctx) |
| return -1; |
| return u_ctx->lldi.rxq_ids[0]; |
| } |
| |
| int chcr_ktls_cpl_act_open_rpl(struct adapter *adap, unsigned char *input); |
| int chcr_ktls_cpl_set_tcb_rpl(struct adapter *adap, unsigned char *input); |
| int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev); |
| int chcr_ktls_dev_add(struct net_device *netdev, struct sock *sk, |
| enum tls_offload_ctx_dir direction, |
| struct tls_crypto_info *crypto_info, |
| u32 start_offload_tcp_sn); |
| void chcr_ktls_dev_del(struct net_device *netdev, |
| struct tls_context *tls_ctx, |
| enum tls_offload_ctx_dir direction); |
| #endif /* CONFIG_CHELSIO_TLS_DEVICE */ |
| #endif /* __CHCR_KTLS_H__ */ |