138032Speter/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2285229Sgshapiro/* Copyright (c) 2019 Mellanox Technologies. */ 364562Sgshapiro 438032Speter#ifndef __MLX5E_KTLS_H__ 538032Speter#define __MLX5E_KTLS_H__ 638032Speter 738032Speter#include <linux/debugfs.h> 838032Speter#include <linux/tls.h> 938032Speter#include <net/tls.h> 1038032Speter#include "en.h" 1138032Speter 1238032Speter#ifdef CONFIG_MLX5_EN_TLS 1338032Speter#include "lib/crypto.h" 1464562Sgshapiro#include "lib/mlx5.h" 15147078Sgshapiro 1664562Sgshapirostruct mlx5_crypto_dek *mlx5_ktls_create_key(struct mlx5_crypto_dek_pool *dek_pool, 17266527Sgshapiro struct tls_crypto_info *crypto_info); 1838032Spetervoid mlx5_ktls_destroy_key(struct mlx5_crypto_dek_pool *dek_pool, 1990792Sgshapiro struct mlx5_crypto_dek *dek); 2038032Speter 2190792Sgshapirostatic inline bool mlx5e_is_ktls_device(struct mlx5_core_dev *mdev) 2290792Sgshapiro{ 2390792Sgshapiro if (is_kdump_kernel()) 24120256Sgshapiro return false; 2590792Sgshapiro 26125820Sgshapiro if (!MLX5_CAP_GEN(mdev, tls_tx) && !MLX5_CAP_GEN(mdev, tls_rx)) 27125820Sgshapiro return false; 28125820Sgshapiro 29363466Sgshapiro if (!MLX5_CAP_GEN(mdev, log_max_dek)) 30125820Sgshapiro return false; 31363466Sgshapiro 32120256Sgshapiro return (MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_128) || 33125820Sgshapiro MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_256)); 34125820Sgshapiro} 35363466Sgshapiro 36125820Sgshapirostatic inline bool mlx5e_ktls_type_check(struct mlx5_core_dev *mdev, 3790792Sgshapiro struct tls_crypto_info *crypto_info) 3890792Sgshapiro{ 39120256Sgshapiro switch (crypto_info->cipher_type) { 40120256Sgshapiro case TLS_CIPHER_AES_GCM_128: 41132943Sgshapiro if (crypto_info->version == TLS_1_2_VERSION) 42132943Sgshapiro return MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_128); 43132943Sgshapiro break; 4490792Sgshapiro case TLS_CIPHER_AES_GCM_256: 4590792Sgshapiro if (crypto_info->version == TLS_1_2_VERSION) 46132943Sgshapiro return MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_256); 47132943Sgshapiro break; 4890792Sgshapiro } 4990792Sgshapiro 5064562Sgshapiro return false; 5190792Sgshapiro} 5290792Sgshapiro 5338032Spetervoid mlx5e_ktls_build_netdev(struct mlx5e_priv *priv); 5438032Speterint mlx5e_ktls_init_tx(struct mlx5e_priv *priv); 5538032Spetervoid mlx5e_ktls_cleanup_tx(struct mlx5e_priv *priv); 5638032Speterint mlx5e_ktls_init_rx(struct mlx5e_priv *priv); 5738032Spetervoid mlx5e_ktls_cleanup_rx(struct mlx5e_priv *priv); 5838032Speterint mlx5e_ktls_set_feature_rx(struct net_device *netdev, bool enable); 5938032Speterstruct mlx5e_ktls_resync_resp * 6038032Spetermlx5e_ktls_rx_resync_create_resp_list(void); 6138032Spetervoid mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list); 6238032Speter 6338032Speterstatic inline bool mlx5e_is_ktls_tx(struct mlx5_core_dev *mdev) 6490792Sgshapiro{ 6590792Sgshapiro return !is_kdump_kernel() && MLX5_CAP_GEN(mdev, tls_tx) && 6690792Sgshapiro !mlx5_get_sd(mdev); 6790792Sgshapiro} 6838032Speter 6938032Speterbool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev); 7038032Speter 7138032Speterstruct mlx5e_tls_sw_stats { 7238032Speter atomic64_t tx_tls_ctx; 7390792Sgshapiro atomic64_t tx_tls_del; 7490792Sgshapiro atomic64_t tx_tls_pool_alloc; 75120256Sgshapiro atomic64_t tx_tls_pool_free; 7638032Speter atomic64_t rx_tls_ctx; 77120256Sgshapiro atomic64_t rx_tls_del; 78120256Sgshapiro}; 79120256Sgshapiro 80120256Sgshapirostruct mlx5e_tls_debugfs { 81120256Sgshapiro struct dentry *dfs; 82120256Sgshapiro struct dentry *dfs_tx; 83120256Sgshapiro}; 84120256Sgshapiro 85120256Sgshapirostruct mlx5e_tls { 86120256Sgshapiro struct mlx5_core_dev *mdev; 87120256Sgshapiro struct mlx5e_tls_sw_stats sw_stats; 88120256Sgshapiro struct workqueue_struct *rx_wq; 89120256Sgshapiro struct mlx5e_tls_tx_pool *tx_pool; 90120256Sgshapiro struct mlx5_crypto_dek_pool *dek_pool; 9190792Sgshapiro struct mlx5e_tls_debugfs debugfs; 9294334Sgshapiro}; 9394334Sgshapiro 9490792Sgshapiroint mlx5e_ktls_init(struct mlx5e_priv *priv); 9590792Sgshapirovoid mlx5e_ktls_cleanup(struct mlx5e_priv *priv); 96111823Sgshapiro 9790792Sgshapiroint mlx5e_ktls_get_count(struct mlx5e_priv *priv); 9890792Sgshapiroint mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data); 9990792Sgshapiroint mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data); 10090792Sgshapiro 10190792Sgshapiro#else 10290792Sgshapirostatic inline void mlx5e_ktls_build_netdev(struct mlx5e_priv *priv) 10390792Sgshapiro{ 10490792Sgshapiro} 10590792Sgshapiro 10690792Sgshapirostatic inline int mlx5e_ktls_init_tx(struct mlx5e_priv *priv) 10790792Sgshapiro{ 10890792Sgshapiro return 0; 10990792Sgshapiro} 11090792Sgshapiro 11190792Sgshapirostatic inline void mlx5e_ktls_cleanup_tx(struct mlx5e_priv *priv) 11290792Sgshapiro{ 11390792Sgshapiro} 11490792Sgshapiro 11590792Sgshapirostatic inline int mlx5e_ktls_init_rx(struct mlx5e_priv *priv) 11690792Sgshapiro{ 11790792Sgshapiro return 0; 11890792Sgshapiro} 11990792Sgshapiro 12090792Sgshapirostatic inline void mlx5e_ktls_cleanup_rx(struct mlx5e_priv *priv) 12190792Sgshapiro{ 12290792Sgshapiro} 12390792Sgshapiro 12490792Sgshapirostatic inline int mlx5e_ktls_set_feature_rx(struct net_device *netdev, bool enable) 12590792Sgshapiro{ 126363466Sgshapiro netdev_warn(netdev, "kTLS is not supported\n"); 12790792Sgshapiro return -EOPNOTSUPP; 12890792Sgshapiro} 12990792Sgshapiro 130203004Sgshapirostatic inline struct mlx5e_ktls_resync_resp * 13190792Sgshapiromlx5e_ktls_rx_resync_create_resp_list(void) 13290792Sgshapiro{ 13390792Sgshapiro return ERR_PTR(-EOPNOTSUPP); 13490792Sgshapiro} 13590792Sgshapiro 13694334Sgshapirostatic inline void 13764562Sgshapiromlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list) {} 13890792Sgshapiro 13990792Sgshapirostatic inline bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev) 14090792Sgshapiro{ 14190792Sgshapiro return false; 142363466Sgshapiro} 143168515Sgshapiro 144168515Sgshapirostatic inline int mlx5e_ktls_init(struct mlx5e_priv *priv) { return 0; } 145168515Sgshapirostatic inline void mlx5e_ktls_cleanup(struct mlx5e_priv *priv) { } 146168515Sgshapirostatic inline int mlx5e_ktls_get_count(struct mlx5e_priv *priv) { return 0; } 147168515Sgshapirostatic inline int mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data) 148168515Sgshapiro{ 149168515Sgshapiro return 0; 15064562Sgshapiro} 15164562Sgshapiro 15264562Sgshapirostatic inline int mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data) 15364562Sgshapiro{ 15464562Sgshapiro return 0; 155110560Sgshapiro} 15690792Sgshapiro#endif 15790792Sgshapiro 15890792Sgshapiro#endif /* __MLX5E_TLS_H__ */ 15990792Sgshapiro