linux/drivers/net/ethernet/mellanox/mlx5/core/accel/tls.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2018 Mellanox Technologies. All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 *
  32 */
  33
  34#include <linux/mlx5/device.h>
  35
  36#include "accel/tls.h"
  37#include "mlx5_core.h"
  38#include "lib/mlx5.h"
  39
  40#ifdef CONFIG_MLX5_FPGA_TLS
  41#include "fpga/tls.h"
  42
  43int mlx5_accel_tls_add_flow(struct mlx5_core_dev *mdev, void *flow,
  44                            struct tls_crypto_info *crypto_info,
  45                            u32 start_offload_tcp_sn, u32 *p_swid,
  46                            bool direction_sx)
  47{
  48        return mlx5_fpga_tls_add_flow(mdev, flow, crypto_info,
  49                                      start_offload_tcp_sn, p_swid,
  50                                      direction_sx);
  51}
  52
  53void mlx5_accel_tls_del_flow(struct mlx5_core_dev *mdev, u32 swid,
  54                             bool direction_sx)
  55{
  56        mlx5_fpga_tls_del_flow(mdev, swid, GFP_KERNEL, direction_sx);
  57}
  58
  59int mlx5_accel_tls_resync_rx(struct mlx5_core_dev *mdev, __be32 handle,
  60                             u32 seq, __be64 rcd_sn)
  61{
  62        return mlx5_fpga_tls_resync_rx(mdev, handle, seq, rcd_sn);
  63}
  64
  65bool mlx5_accel_is_tls_device(struct mlx5_core_dev *mdev)
  66{
  67        return mlx5_fpga_is_tls_device(mdev) ||
  68                mlx5_accel_is_ktls_device(mdev);
  69}
  70
  71u32 mlx5_accel_tls_device_caps(struct mlx5_core_dev *mdev)
  72{
  73        return mlx5_fpga_tls_device_caps(mdev);
  74}
  75
  76int mlx5_accel_tls_init(struct mlx5_core_dev *mdev)
  77{
  78        return mlx5_fpga_tls_init(mdev);
  79}
  80
  81void mlx5_accel_tls_cleanup(struct mlx5_core_dev *mdev)
  82{
  83        mlx5_fpga_tls_cleanup(mdev);
  84}
  85#endif
  86
  87#ifdef CONFIG_MLX5_TLS
  88int mlx5_ktls_create_key(struct mlx5_core_dev *mdev,
  89                         struct tls_crypto_info *crypto_info,
  90                         u32 *p_key_id)
  91{
  92        u32 sz_bytes;
  93        void *key;
  94
  95        switch (crypto_info->cipher_type) {
  96        case TLS_CIPHER_AES_GCM_128: {
  97                struct tls12_crypto_info_aes_gcm_128 *info =
  98                        (struct tls12_crypto_info_aes_gcm_128 *)crypto_info;
  99
 100                key      = info->key;
 101                sz_bytes = sizeof(info->key);
 102                break;
 103        }
 104        case TLS_CIPHER_AES_GCM_256: {
 105                struct tls12_crypto_info_aes_gcm_256 *info =
 106                        (struct tls12_crypto_info_aes_gcm_256 *)crypto_info;
 107
 108                key      = info->key;
 109                sz_bytes = sizeof(info->key);
 110                break;
 111        }
 112        default:
 113                return -EINVAL;
 114        }
 115
 116        return mlx5_create_encryption_key(mdev, key, sz_bytes,
 117                                          MLX5_ACCEL_OBJ_TLS_KEY,
 118                                          p_key_id);
 119}
 120
 121void mlx5_ktls_destroy_key(struct mlx5_core_dev *mdev, u32 key_id)
 122{
 123        mlx5_destroy_encryption_key(mdev, key_id);
 124}
 125#endif
 126