net/mlx5: Delete metadata handling logic
Remove specific to FPGS IPsec metadata handling logic which is not required for mlx5 NICs devices. Link: https://lore.kernel.org/r/fe67a1de4fc6032a940e18c8a6461a1ccf902fc4.1649232994.git.leonro@nvidia.com Reviewed-by: Raed Salem <raeds@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
This commit is contained in:
parent
2fa33b3518
commit
df439fcb1c
@ -1,36 +0,0 @@
|
|||||||
#ifndef __MLX5E_ACCEL_H__
|
|
||||||
#define __MLX5E_ACCEL_H__
|
|
||||||
|
|
||||||
#ifdef CONFIG_MLX5_ACCEL
|
|
||||||
|
|
||||||
#include <linux/skbuff.h>
|
|
||||||
#include <linux/netdevice.h>
|
|
||||||
|
|
||||||
static inline bool is_metadata_hdr_valid(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
__be16 *ethtype;
|
|
||||||
|
|
||||||
if (unlikely(skb->len < ETH_HLEN + MLX5E_METADATA_ETHER_LEN))
|
|
||||||
return false;
|
|
||||||
ethtype = (__be16 *)(skb->data + ETH_ALEN * 2);
|
|
||||||
if (*ethtype != cpu_to_be16(MLX5E_METADATA_ETHER_TYPE))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void remove_metadata_hdr(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct ethhdr *old_eth;
|
|
||||||
struct ethhdr *new_eth;
|
|
||||||
|
|
||||||
/* Remove the metadata from the buffer */
|
|
||||||
old_eth = (struct ethhdr *)skb->data;
|
|
||||||
new_eth = (struct ethhdr *)(skb->data + MLX5E_METADATA_ETHER_LEN);
|
|
||||||
memmove(new_eth, old_eth, 2 * ETH_ALEN);
|
|
||||||
/* Ethertype is already in its new place */
|
|
||||||
skb_pull_inline(skb, MLX5E_METADATA_ETHER_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_MLX5_ACCEL */
|
|
||||||
|
|
||||||
#endif /* __MLX5E_EN_ACCEL_H__ */
|
|
@ -116,7 +116,6 @@ struct mlx5e_ipsec_sa_entry {
|
|||||||
struct mlx5e_ipsec_rule ipsec_rule;
|
struct mlx5e_ipsec_rule ipsec_rule;
|
||||||
};
|
};
|
||||||
|
|
||||||
void mlx5e_ipsec_build_inverse_table(void);
|
|
||||||
int mlx5e_ipsec_init(struct mlx5e_priv *priv);
|
int mlx5e_ipsec_init(struct mlx5e_priv *priv);
|
||||||
void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv);
|
void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv);
|
||||||
void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv);
|
void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv);
|
||||||
@ -125,11 +124,6 @@ struct xfrm_state *mlx5e_ipsec_sadb_rx_lookup(struct mlx5e_ipsec *dev,
|
|||||||
unsigned int handle);
|
unsigned int handle);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline void mlx5e_ipsec_build_inverse_table(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int mlx5e_ipsec_init(struct mlx5e_priv *priv)
|
static inline int mlx5e_ipsec_init(struct mlx5e_priv *priv)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -37,75 +37,13 @@
|
|||||||
#include "accel/ipsec_offload.h"
|
#include "accel/ipsec_offload.h"
|
||||||
#include "en_accel/ipsec_rxtx.h"
|
#include "en_accel/ipsec_rxtx.h"
|
||||||
#include "en_accel/ipsec.h"
|
#include "en_accel/ipsec.h"
|
||||||
#include "accel/accel.h"
|
|
||||||
#include "en.h"
|
#include "en.h"
|
||||||
|
|
||||||
enum {
|
|
||||||
MLX5E_IPSEC_RX_SYNDROME_DECRYPTED = 0x11,
|
|
||||||
MLX5E_IPSEC_RX_SYNDROME_AUTH_FAILED = 0x12,
|
|
||||||
MLX5E_IPSEC_RX_SYNDROME_BAD_PROTO = 0x17,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mlx5e_ipsec_rx_metadata {
|
|
||||||
unsigned char nexthdr;
|
|
||||||
__be32 sa_handle;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MLX5E_IPSEC_TX_SYNDROME_OFFLOAD = 0x8,
|
MLX5E_IPSEC_TX_SYNDROME_OFFLOAD = 0x8,
|
||||||
MLX5E_IPSEC_TX_SYNDROME_OFFLOAD_WITH_LSO_TCP = 0x9,
|
MLX5E_IPSEC_TX_SYNDROME_OFFLOAD_WITH_LSO_TCP = 0x9,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5e_ipsec_tx_metadata {
|
|
||||||
__be16 mss_inv; /* 1/MSS in 16bit fixed point, only for LSO */
|
|
||||||
__be16 seq; /* LSBs of the first TCP seq, only for LSO */
|
|
||||||
u8 esp_next_proto; /* Next protocol of ESP */
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
struct mlx5e_ipsec_metadata {
|
|
||||||
unsigned char syndrome;
|
|
||||||
union {
|
|
||||||
unsigned char raw[5];
|
|
||||||
/* from FPGA to host, on successful decrypt */
|
|
||||||
struct mlx5e_ipsec_rx_metadata rx;
|
|
||||||
/* from host to FPGA */
|
|
||||||
struct mlx5e_ipsec_tx_metadata tx;
|
|
||||||
} __packed content;
|
|
||||||
/* packet type ID field */
|
|
||||||
__be16 ethertype;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
#define MAX_LSO_MSS 2048
|
|
||||||
|
|
||||||
/* Pre-calculated (Q0.16) fixed-point inverse 1/x function */
|
|
||||||
static __be16 mlx5e_ipsec_inverse_table[MAX_LSO_MSS];
|
|
||||||
|
|
||||||
static inline __be16 mlx5e_ipsec_mss_inv(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
return mlx5e_ipsec_inverse_table[skb_shinfo(skb)->gso_size];
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct mlx5e_ipsec_metadata *mlx5e_ipsec_add_metadata(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct mlx5e_ipsec_metadata *mdata;
|
|
||||||
struct ethhdr *eth;
|
|
||||||
|
|
||||||
if (unlikely(skb_cow_head(skb, sizeof(*mdata))))
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
|
|
||||||
eth = (struct ethhdr *)skb_push(skb, sizeof(*mdata));
|
|
||||||
skb->mac_header -= sizeof(*mdata);
|
|
||||||
mdata = (struct mlx5e_ipsec_metadata *)(eth + 1);
|
|
||||||
|
|
||||||
memmove(skb->data, skb->data + sizeof(*mdata),
|
|
||||||
2 * ETH_ALEN);
|
|
||||||
|
|
||||||
eth->h_proto = cpu_to_be16(MLX5E_METADATA_ETHER_TYPE);
|
|
||||||
|
|
||||||
memset(mdata->content.raw, 0, sizeof(mdata->content.raw));
|
|
||||||
return mdata;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mlx5e_ipsec_remove_trailer(struct sk_buff *skb, struct xfrm_state *x)
|
static int mlx5e_ipsec_remove_trailer(struct sk_buff *skb, struct xfrm_state *x)
|
||||||
{
|
{
|
||||||
unsigned int alen = crypto_aead_authsize(x->data);
|
unsigned int alen = crypto_aead_authsize(x->data);
|
||||||
@ -244,40 +182,6 @@ void mlx5e_ipsec_set_iv(struct sk_buff *skb, struct xfrm_state *x,
|
|||||||
skb_store_bits(skb, iv_offset, &seqno, 8);
|
skb_store_bits(skb, iv_offset, &seqno, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mlx5e_ipsec_set_metadata(struct sk_buff *skb,
|
|
||||||
struct mlx5e_ipsec_metadata *mdata,
|
|
||||||
struct xfrm_offload *xo)
|
|
||||||
{
|
|
||||||
struct ip_esp_hdr *esph;
|
|
||||||
struct tcphdr *tcph;
|
|
||||||
|
|
||||||
if (skb_is_gso(skb)) {
|
|
||||||
/* Add LSO metadata indication */
|
|
||||||
esph = ip_esp_hdr(skb);
|
|
||||||
tcph = inner_tcp_hdr(skb);
|
|
||||||
netdev_dbg(skb->dev, " Offloading GSO packet outer L3 %u; L4 %u; Inner L3 %u; L4 %u\n",
|
|
||||||
skb->network_header,
|
|
||||||
skb->transport_header,
|
|
||||||
skb->inner_network_header,
|
|
||||||
skb->inner_transport_header);
|
|
||||||
netdev_dbg(skb->dev, " Offloading GSO packet of len %u; mss %u; TCP sp %u dp %u seq 0x%x ESP seq 0x%x\n",
|
|
||||||
skb->len, skb_shinfo(skb)->gso_size,
|
|
||||||
ntohs(tcph->source), ntohs(tcph->dest),
|
|
||||||
ntohl(tcph->seq), ntohl(esph->seq_no));
|
|
||||||
mdata->syndrome = MLX5E_IPSEC_TX_SYNDROME_OFFLOAD_WITH_LSO_TCP;
|
|
||||||
mdata->content.tx.mss_inv = mlx5e_ipsec_mss_inv(skb);
|
|
||||||
mdata->content.tx.seq = htons(ntohl(tcph->seq) & 0xFFFF);
|
|
||||||
} else {
|
|
||||||
mdata->syndrome = MLX5E_IPSEC_TX_SYNDROME_OFFLOAD;
|
|
||||||
}
|
|
||||||
mdata->content.tx.esp_next_proto = xo->proto;
|
|
||||||
|
|
||||||
netdev_dbg(skb->dev, " TX metadata syndrome %u proto %u mss_inv %04x seq %04x\n",
|
|
||||||
mdata->syndrome, mdata->content.tx.esp_next_proto,
|
|
||||||
ntohs(mdata->content.tx.mss_inv),
|
|
||||||
ntohs(mdata->content.tx.seq));
|
|
||||||
}
|
|
||||||
|
|
||||||
void mlx5e_ipsec_handle_tx_wqe(struct mlx5e_tx_wqe *wqe,
|
void mlx5e_ipsec_handle_tx_wqe(struct mlx5e_tx_wqe *wqe,
|
||||||
struct mlx5e_accel_tx_ipsec_state *ipsec_st,
|
struct mlx5e_accel_tx_ipsec_state *ipsec_st,
|
||||||
struct mlx5_wqe_inline_seg *inlseg)
|
struct mlx5_wqe_inline_seg *inlseg)
|
||||||
@ -363,7 +267,6 @@ bool mlx5e_ipsec_handle_tx_skb(struct net_device *netdev,
|
|||||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||||
struct xfrm_offload *xo = xfrm_offload(skb);
|
struct xfrm_offload *xo = xfrm_offload(skb);
|
||||||
struct mlx5e_ipsec_sa_entry *sa_entry;
|
struct mlx5e_ipsec_sa_entry *sa_entry;
|
||||||
struct mlx5e_ipsec_metadata *mdata;
|
|
||||||
struct xfrm_state *x;
|
struct xfrm_state *x;
|
||||||
struct sec_path *sp;
|
struct sec_path *sp;
|
||||||
|
|
||||||
@ -392,19 +295,8 @@ bool mlx5e_ipsec_handle_tx_skb(struct net_device *netdev,
|
|||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MLX5_CAP_GEN(priv->mdev, fpga)) {
|
|
||||||
mdata = mlx5e_ipsec_add_metadata(skb);
|
|
||||||
if (IS_ERR(mdata)) {
|
|
||||||
atomic64_inc(&priv->ipsec->sw_stats.ipsec_tx_drop_metadata);
|
|
||||||
goto drop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sa_entry = (struct mlx5e_ipsec_sa_entry *)x->xso.offload_handle;
|
sa_entry = (struct mlx5e_ipsec_sa_entry *)x->xso.offload_handle;
|
||||||
sa_entry->set_iv_op(skb, x, xo);
|
sa_entry->set_iv_op(skb, x, xo);
|
||||||
if (MLX5_CAP_GEN(priv->mdev, fpga))
|
|
||||||
mlx5e_ipsec_set_metadata(skb, mdata, xo);
|
|
||||||
|
|
||||||
mlx5e_ipsec_set_state(priv, skb, x, xo, ipsec_st);
|
mlx5e_ipsec_set_state(priv, skb, x, xo, ipsec_st);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -414,79 +306,6 @@ drop:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct xfrm_state *
|
|
||||||
mlx5e_ipsec_build_sp(struct net_device *netdev, struct sk_buff *skb,
|
|
||||||
struct mlx5e_ipsec_metadata *mdata)
|
|
||||||
{
|
|
||||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
||||||
struct xfrm_offload *xo;
|
|
||||||
struct xfrm_state *xs;
|
|
||||||
struct sec_path *sp;
|
|
||||||
u32 sa_handle;
|
|
||||||
|
|
||||||
sp = secpath_set(skb);
|
|
||||||
if (unlikely(!sp)) {
|
|
||||||
atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_sp_alloc);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sa_handle = be32_to_cpu(mdata->content.rx.sa_handle);
|
|
||||||
xs = mlx5e_ipsec_sadb_rx_lookup(priv->ipsec, sa_handle);
|
|
||||||
if (unlikely(!xs)) {
|
|
||||||
atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_sadb_miss);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp = skb_sec_path(skb);
|
|
||||||
sp->xvec[sp->len++] = xs;
|
|
||||||
sp->olen++;
|
|
||||||
|
|
||||||
xo = xfrm_offload(skb);
|
|
||||||
xo->flags = CRYPTO_DONE;
|
|
||||||
switch (mdata->syndrome) {
|
|
||||||
case MLX5E_IPSEC_RX_SYNDROME_DECRYPTED:
|
|
||||||
xo->status = CRYPTO_SUCCESS;
|
|
||||||
if (likely(priv->ipsec->no_trailer)) {
|
|
||||||
xo->flags |= XFRM_ESP_NO_TRAILER;
|
|
||||||
xo->proto = mdata->content.rx.nexthdr;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MLX5E_IPSEC_RX_SYNDROME_AUTH_FAILED:
|
|
||||||
xo->status = CRYPTO_TUNNEL_ESP_AUTH_FAILED;
|
|
||||||
break;
|
|
||||||
case MLX5E_IPSEC_RX_SYNDROME_BAD_PROTO:
|
|
||||||
xo->status = CRYPTO_INVALID_PROTOCOL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_syndrome);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return xs;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sk_buff *mlx5e_ipsec_handle_rx_skb(struct net_device *netdev,
|
|
||||||
struct sk_buff *skb, u32 *cqe_bcnt)
|
|
||||||
{
|
|
||||||
struct mlx5e_ipsec_metadata *mdata;
|
|
||||||
struct xfrm_state *xs;
|
|
||||||
|
|
||||||
if (!is_metadata_hdr_valid(skb))
|
|
||||||
return skb;
|
|
||||||
|
|
||||||
/* Use the metadata */
|
|
||||||
mdata = (struct mlx5e_ipsec_metadata *)(skb->data + ETH_HLEN);
|
|
||||||
xs = mlx5e_ipsec_build_sp(netdev, skb, mdata);
|
|
||||||
if (unlikely(!xs)) {
|
|
||||||
kfree_skb(skb);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_metadata_hdr(skb);
|
|
||||||
*cqe_bcnt -= MLX5E_METADATA_ETHER_LEN;
|
|
||||||
|
|
||||||
return skb;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MLX5E_IPSEC_OFFLOAD_RX_SYNDROME_DECRYPTED,
|
MLX5E_IPSEC_OFFLOAD_RX_SYNDROME_DECRYPTED,
|
||||||
MLX5E_IPSEC_OFFLOAD_RX_SYNDROME_AUTH_FAILED,
|
MLX5E_IPSEC_OFFLOAD_RX_SYNDROME_AUTH_FAILED,
|
||||||
@ -541,21 +360,3 @@ void mlx5e_ipsec_offload_handle_rx_skb(struct net_device *netdev,
|
|||||||
atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_syndrome);
|
atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_syndrome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mlx5e_ipsec_build_inverse_table(void)
|
|
||||||
{
|
|
||||||
u16 mss_inv;
|
|
||||||
u32 mss;
|
|
||||||
|
|
||||||
/* Calculate 1/x inverse table for use in GSO data path.
|
|
||||||
* Using this table, we provide the IPSec accelerator with the value of
|
|
||||||
* 1/gso_size so that it can infer the position of each segment inside
|
|
||||||
* the GSO, and increment the ESP sequence number, and generate the IV.
|
|
||||||
* The HW needs this value in Q0.16 fixed-point number format
|
|
||||||
*/
|
|
||||||
mlx5e_ipsec_inverse_table[1] = htons(0xFFFF);
|
|
||||||
for (mss = 2; mss < MAX_LSO_MSS; mss++) {
|
|
||||||
mss_inv = div_u64(1ULL << 32, mss) >> 16;
|
|
||||||
mlx5e_ipsec_inverse_table[mss] = htons(mss_inv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -53,9 +53,6 @@ struct mlx5e_accel_tx_ipsec_state {
|
|||||||
|
|
||||||
#ifdef CONFIG_MLX5_EN_IPSEC
|
#ifdef CONFIG_MLX5_EN_IPSEC
|
||||||
|
|
||||||
struct sk_buff *mlx5e_ipsec_handle_rx_skb(struct net_device *netdev,
|
|
||||||
struct sk_buff *skb, u32 *cqe_bcnt);
|
|
||||||
|
|
||||||
void mlx5e_ipsec_inverse_table_init(void);
|
void mlx5e_ipsec_inverse_table_init(void);
|
||||||
void mlx5e_ipsec_set_iv_esn(struct sk_buff *skb, struct xfrm_state *x,
|
void mlx5e_ipsec_set_iv_esn(struct sk_buff *skb, struct xfrm_state *x,
|
||||||
struct xfrm_offload *xo);
|
struct xfrm_offload *xo);
|
||||||
|
@ -5693,7 +5693,6 @@ int mlx5e_init(void)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mlx5e_ipsec_build_inverse_table();
|
|
||||||
mlx5e_build_ptys2ethtool_map();
|
mlx5e_build_ptys2ethtool_map();
|
||||||
ret = auxiliary_driver_register(&mlx5e_driver);
|
ret = auxiliary_driver_register(&mlx5e_driver);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
Loading…
Reference in New Issue
Block a user