net/mlx5e: Create Advanced Steering Operation object for IPsec
Setup the ASO (Advanced Steering Operation) object that is needed for IPsec to interact with SW stack about various fast changing events: replay window, lifetime limits, e.t.c Reviewed-by: Raed Salem <raeds@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
c7049ca621
commit
8518d05b8f
@ -1245,4 +1245,5 @@ int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_t
|
|||||||
int mlx5e_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi);
|
int mlx5e_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi);
|
||||||
int mlx5e_get_vf_stats(struct net_device *dev, int vf, struct ifla_vf_stats *vf_stats);
|
int mlx5e_get_vf_stats(struct net_device *dev, int vf, struct ifla_vf_stats *vf_stats);
|
||||||
#endif
|
#endif
|
||||||
|
int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey);
|
||||||
#endif /* __MLX5_EN_H__ */
|
#endif /* __MLX5_EN_H__ */
|
||||||
|
@ -373,6 +373,13 @@ void mlx5e_ipsec_init(struct mlx5e_priv *priv)
|
|||||||
if (!ipsec->wq)
|
if (!ipsec->wq)
|
||||||
goto err_wq;
|
goto err_wq;
|
||||||
|
|
||||||
|
if (mlx5_ipsec_device_caps(priv->mdev) &
|
||||||
|
MLX5_IPSEC_CAP_PACKET_OFFLOAD) {
|
||||||
|
ret = mlx5e_ipsec_aso_init(ipsec);
|
||||||
|
if (ret)
|
||||||
|
goto err_aso;
|
||||||
|
}
|
||||||
|
|
||||||
ret = mlx5e_accel_ipsec_fs_init(ipsec);
|
ret = mlx5e_accel_ipsec_fs_init(ipsec);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_fs_init;
|
goto err_fs_init;
|
||||||
@ -383,6 +390,9 @@ void mlx5e_ipsec_init(struct mlx5e_priv *priv)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
err_fs_init:
|
err_fs_init:
|
||||||
|
if (mlx5_ipsec_device_caps(priv->mdev) & MLX5_IPSEC_CAP_PACKET_OFFLOAD)
|
||||||
|
mlx5e_ipsec_aso_cleanup(ipsec);
|
||||||
|
err_aso:
|
||||||
destroy_workqueue(ipsec->wq);
|
destroy_workqueue(ipsec->wq);
|
||||||
err_wq:
|
err_wq:
|
||||||
kfree(ipsec);
|
kfree(ipsec);
|
||||||
@ -398,6 +408,8 @@ void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
mlx5e_accel_ipsec_fs_cleanup(ipsec);
|
mlx5e_accel_ipsec_fs_cleanup(ipsec);
|
||||||
|
if (mlx5_ipsec_device_caps(priv->mdev) & MLX5_IPSEC_CAP_PACKET_OFFLOAD)
|
||||||
|
mlx5e_ipsec_aso_cleanup(ipsec);
|
||||||
destroy_workqueue(ipsec->wq);
|
destroy_workqueue(ipsec->wq);
|
||||||
kfree(ipsec);
|
kfree(ipsec);
|
||||||
priv->ipsec = NULL;
|
priv->ipsec = NULL;
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <linux/mlx5/device.h>
|
#include <linux/mlx5/device.h>
|
||||||
#include <net/xfrm.h>
|
#include <net/xfrm.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
|
#include "lib/aso.h"
|
||||||
|
|
||||||
#define MLX5E_IPSEC_SADB_RX_BITS 10
|
#define MLX5E_IPSEC_SADB_RX_BITS 10
|
||||||
#define MLX5E_IPSEC_ESN_SCOPE_MID 0x80000000L
|
#define MLX5E_IPSEC_ESN_SCOPE_MID 0x80000000L
|
||||||
@ -97,6 +98,14 @@ struct mlx5e_ipsec_sw_stats {
|
|||||||
struct mlx5e_ipsec_rx;
|
struct mlx5e_ipsec_rx;
|
||||||
struct mlx5e_ipsec_tx;
|
struct mlx5e_ipsec_tx;
|
||||||
|
|
||||||
|
struct mlx5e_ipsec_aso {
|
||||||
|
u8 ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
|
||||||
|
dma_addr_t dma_addr;
|
||||||
|
struct mlx5_aso *aso;
|
||||||
|
u32 pdn;
|
||||||
|
u32 mkey;
|
||||||
|
};
|
||||||
|
|
||||||
struct mlx5e_ipsec {
|
struct mlx5e_ipsec {
|
||||||
struct mlx5_core_dev *mdev;
|
struct mlx5_core_dev *mdev;
|
||||||
DECLARE_HASHTABLE(sadb_rx, MLX5E_IPSEC_SADB_RX_BITS);
|
DECLARE_HASHTABLE(sadb_rx, MLX5E_IPSEC_SADB_RX_BITS);
|
||||||
@ -107,6 +116,7 @@ struct mlx5e_ipsec {
|
|||||||
struct mlx5e_ipsec_rx *rx_ipv4;
|
struct mlx5e_ipsec_rx *rx_ipv4;
|
||||||
struct mlx5e_ipsec_rx *rx_ipv6;
|
struct mlx5e_ipsec_rx *rx_ipv6;
|
||||||
struct mlx5e_ipsec_tx *tx;
|
struct mlx5e_ipsec_tx *tx;
|
||||||
|
struct mlx5e_ipsec_aso *aso;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5e_ipsec_esn_state {
|
struct mlx5e_ipsec_esn_state {
|
||||||
@ -160,6 +170,9 @@ u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev);
|
|||||||
void mlx5_accel_esp_modify_xfrm(struct mlx5e_ipsec_sa_entry *sa_entry,
|
void mlx5_accel_esp_modify_xfrm(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||||
const struct mlx5_accel_esp_xfrm_attrs *attrs);
|
const struct mlx5_accel_esp_xfrm_attrs *attrs);
|
||||||
|
|
||||||
|
int mlx5e_ipsec_aso_init(struct mlx5e_ipsec *ipsec);
|
||||||
|
void mlx5e_ipsec_aso_cleanup(struct mlx5e_ipsec *ipsec);
|
||||||
|
|
||||||
static inline struct mlx5_core_dev *
|
static inline struct mlx5_core_dev *
|
||||||
mlx5e_ipsec_sa2dev(struct mlx5e_ipsec_sa_entry *sa_entry)
|
mlx5e_ipsec_sa2dev(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
/* Copyright (c) 2017, Mellanox Technologies inc. All rights reserved. */
|
/* Copyright (c) 2017, Mellanox Technologies inc. All rights reserved. */
|
||||||
|
|
||||||
#include "mlx5_core.h"
|
#include "mlx5_core.h"
|
||||||
|
#include "en.h"
|
||||||
#include "ipsec.h"
|
#include "ipsec.h"
|
||||||
#include "lib/mlx5.h"
|
#include "lib/mlx5.h"
|
||||||
|
|
||||||
@ -207,3 +208,56 @@ void mlx5_accel_esp_modify_xfrm(struct mlx5e_ipsec_sa_entry *sa_entry,
|
|||||||
|
|
||||||
memcpy(&sa_entry->attrs, attrs, sizeof(sa_entry->attrs));
|
memcpy(&sa_entry->attrs, attrs, sizeof(sa_entry->attrs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mlx5e_ipsec_aso_init(struct mlx5e_ipsec *ipsec)
|
||||||
|
{
|
||||||
|
struct mlx5_core_dev *mdev = ipsec->mdev;
|
||||||
|
struct mlx5e_ipsec_aso *aso;
|
||||||
|
struct mlx5e_hw_objs *res;
|
||||||
|
struct device *pdev;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
aso = kzalloc(sizeof(*ipsec->aso), GFP_KERNEL);
|
||||||
|
if (!aso)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
res = &mdev->mlx5e_res.hw_objs;
|
||||||
|
|
||||||
|
pdev = mlx5_core_dma_dev(mdev);
|
||||||
|
aso->dma_addr = dma_map_single(pdev, aso->ctx, sizeof(aso->ctx),
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
|
err = dma_mapping_error(pdev, aso->dma_addr);
|
||||||
|
if (err)
|
||||||
|
goto err_dma;
|
||||||
|
|
||||||
|
aso->aso = mlx5_aso_create(mdev, res->pdn);
|
||||||
|
if (IS_ERR(aso->aso)) {
|
||||||
|
err = PTR_ERR(aso->aso);
|
||||||
|
goto err_aso_create;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipsec->aso = aso;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_aso_create:
|
||||||
|
dma_unmap_single(pdev, aso->dma_addr, sizeof(aso->ctx),
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
|
err_dma:
|
||||||
|
kfree(aso);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mlx5e_ipsec_aso_cleanup(struct mlx5e_ipsec *ipsec)
|
||||||
|
{
|
||||||
|
struct mlx5_core_dev *mdev = ipsec->mdev;
|
||||||
|
struct mlx5e_ipsec_aso *aso;
|
||||||
|
struct device *pdev;
|
||||||
|
|
||||||
|
aso = ipsec->aso;
|
||||||
|
pdev = mlx5_core_dma_dev(mdev);
|
||||||
|
|
||||||
|
mlx5_aso_destroy(aso->aso);
|
||||||
|
dma_unmap_single(pdev, aso->dma_addr, sizeof(aso->ctx),
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
|
kfree(aso);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user