File Index
Files and directories
Sign in
FILE

ktls_txrx.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_txrx.c C
  1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
  2/* Copyright (c) 2020, Mellanox Technologies inc. All rights reserved. */
  3
  4#include "en_accel/ktls_txrx.h"
  5#include "en_accel/ktls_utils.h"
  6
  7enum {
  8	MLX5E_STATIC_PARAMS_CONTEXT_TLS_1_2 = 0x2,
  9};
 10
 11enum {
 12	MLX5E_ENCRYPTION_STANDARD_TLS = 0x1,
 13};
 14
 15#define EXTRACT_INFO_FIELDS do { \
 16	salt    = info->salt;    \
 17	rec_seq = info->rec_seq; \
 18	salt_sz    = sizeof(info->salt);    \
 19	rec_seq_sz = sizeof(info->rec_seq); \
 20} while (0)
 21
 22static void
 23fill_static_params(struct mlx5_wqe_tls_static_params_seg *params,
 24		   union mlx5e_crypto_info *crypto_info,
 25		   u32 key_id, u32 resync_tcp_sn)
 26{
 27	char *initial_rn, *gcm_iv;
 28	u16 salt_sz, rec_seq_sz;
 29	char *salt, *rec_seq;
 30	u8 tls_version;
 31	u8 *ctx;
 32
 33	ctx = params->ctx;
 34
 35	switch (crypto_info->crypto_info.cipher_type) {
 36	case TLS_CIPHER_AES_GCM_128: {
 37		struct tls12_crypto_info_aes_gcm_128 *info =
 38			&crypto_info->crypto_info_128;
 39
 40		EXTRACT_INFO_FIELDS;
 41		break;
 42	}
 43	case TLS_CIPHER_AES_GCM_256: {
 44		struct tls12_crypto_info_aes_gcm_256 *info =
 45			&crypto_info->crypto_info_256;
 46
 47		EXTRACT_INFO_FIELDS;
 48		break;
 49	}
 50	default:
 51		WARN_ONCE(1, "Unsupported cipher type %u\n",
 52			  crypto_info->crypto_info.cipher_type);
 53		return;
 54	}
 55
 56	gcm_iv      = MLX5_ADDR_OF(tls_static_params, ctx, gcm_iv);
 57	initial_rn  = MLX5_ADDR_OF(tls_static_params, ctx, initial_record_number);
 58
 59	memcpy(gcm_iv,      salt,    salt_sz);
 60	memcpy(initial_rn,  rec_seq, rec_seq_sz);
 61
 62	tls_version = MLX5E_STATIC_PARAMS_CONTEXT_TLS_1_2;
 63
 64	MLX5_SET(tls_static_params, ctx, tls_version, tls_version);
 65	MLX5_SET(tls_static_params, ctx, const_1, 1);
 66	MLX5_SET(tls_static_params, ctx, const_2, 2);
 67	MLX5_SET(tls_static_params, ctx, encryption_standard,
 68		 MLX5E_ENCRYPTION_STANDARD_TLS);
 69	MLX5_SET(tls_static_params, ctx, resync_tcp_sn, resync_tcp_sn);
 70	MLX5_SET(tls_static_params, ctx, dek_index, key_id);
 71}
 72
 73void
 74mlx5e_ktls_build_static_params(struct mlx5e_set_tls_static_params_wqe *wqe,
 75			       u16 pc, u32 sqn,
 76			       union mlx5e_crypto_info *crypto_info,
 77			       u32 tis_tir_num, u32 key_id, u32 resync_tcp_sn,
 78			       bool fence, enum tls_offload_ctx_dir direction)
 79{
 80	struct mlx5_wqe_umr_ctrl_seg *ucseg = &wqe->uctrl;
 81	struct mlx5_wqe_ctrl_seg     *cseg  = &wqe->ctrl;
 82	u8 opmod = direction == TLS_OFFLOAD_CTX_DIR_TX ?
 83		MLX5_OPC_MOD_TLS_TIS_STATIC_PARAMS :
 84		MLX5_OPC_MOD_TLS_TIR_STATIC_PARAMS;
 85
 86#define STATIC_PARAMS_DS_CNT DIV_ROUND_UP(sizeof(*wqe), MLX5_SEND_WQE_DS)
 87
 88	cseg->opmod_idx_opcode = cpu_to_be32((pc << 8) | MLX5_OPCODE_UMR | (opmod << 24));
 89	cseg->qpn_ds           = cpu_to_be32((sqn << MLX5_WQE_CTRL_QPN_SHIFT) |
 90					     STATIC_PARAMS_DS_CNT);
 91	cseg->fm_ce_se         = fence ? MLX5_FENCE_MODE_INITIATOR_SMALL : 0;
 92	cseg->tis_tir_num      = cpu_to_be32(tis_tir_num << 8);
 93
 94	ucseg->flags = MLX5_UMR_INLINE;
 95	ucseg->bsf_octowords = cpu_to_be16(MLX5_ST_SZ_BYTES(tls_static_params) / 16);
 96
 97	fill_static_params(&wqe->params, crypto_info, key_id, resync_tcp_sn);
 98}
 99
100static void
101fill_progress_params(struct mlx5_wqe_tls_progress_params_seg *params, u32 tis_tir_num,
102		     u32 next_record_tcp_sn)
103{
104	u8 *ctx = params->ctx;
105
106	params->tis_tir_num = cpu_to_be32(tis_tir_num);
107
108	MLX5_SET(tls_progress_params, ctx, next_record_tcp_sn,
109		 next_record_tcp_sn);
110	MLX5_SET(tls_progress_params, ctx, record_tracker_state,
111		 MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_START);
112	MLX5_SET(tls_progress_params, ctx, auth_state,
113		 MLX5E_TLS_PROGRESS_PARAMS_AUTH_STATE_NO_OFFLOAD);
114}
115
116void
117mlx5e_ktls_build_progress_params(struct mlx5e_set_tls_progress_params_wqe *wqe,
118				 u16 pc, u32 sqn,
119				 u32 tis_tir_num, bool fence,
120				 u32 next_record_tcp_sn,
121				 enum tls_offload_ctx_dir direction)
122{
123	struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
124	u8 opmod = direction == TLS_OFFLOAD_CTX_DIR_TX ?
125		MLX5_OPC_MOD_TLS_TIS_PROGRESS_PARAMS :
126		MLX5_OPC_MOD_TLS_TIR_PROGRESS_PARAMS;
127
128#define PROGRESS_PARAMS_DS_CNT DIV_ROUND_UP(sizeof(*wqe), MLX5_SEND_WQE_DS)
129
130	cseg->opmod_idx_opcode =
131		cpu_to_be32((pc << 8) | MLX5_OPCODE_SET_PSV | (opmod << 24));
132	cseg->qpn_ds           = cpu_to_be32((sqn << MLX5_WQE_CTRL_QPN_SHIFT) |
133					     PROGRESS_PARAMS_DS_CNT);
134	cseg->fm_ce_se         = fence ? MLX5_FENCE_MODE_INITIATOR_SMALL : 0;
135
136	fill_progress_params(&wqe->params, tis_tir_num, next_record_tcp_sn);
137}
138
~/ Read-only file preview.