mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 19:16:45 +07:00
net/mlx5: Accel, add common metadata functions
This patch adds common functions to handle mellanox metadata headers. These functions are used by IPsec and TLS to process FPGA metadata. Signed-off-by: Boris Pismenny <borisp@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
790af90c00
commit
10e71acca2
37
drivers/net/ethernet/mellanox/mlx5/core/accel/accel.h
Normal file
37
drivers/net/ethernet/mellanox/mlx5/core/accel/accel.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef __MLX5E_ACCEL_H__
|
||||
#define __MLX5E_ACCEL_H__
|
||||
|
||||
#ifdef CONFIG_MLX5_ACCEL
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include "en.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__ */
|
@ -37,6 +37,7 @@
|
||||
|
||||
#include "en_accel/ipsec_rxtx.h"
|
||||
#include "en_accel/ipsec.h"
|
||||
#include "accel/accel.h"
|
||||
#include "en.h"
|
||||
|
||||
enum {
|
||||
@ -346,19 +347,12 @@ mlx5e_ipsec_build_sp(struct net_device *netdev, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
struct sk_buff *mlx5e_ipsec_handle_rx_skb(struct net_device *netdev,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb, u32 *cqe_bcnt)
|
||||
{
|
||||
struct mlx5e_ipsec_metadata *mdata;
|
||||
struct ethhdr *old_eth;
|
||||
struct ethhdr *new_eth;
|
||||
struct xfrm_state *xs;
|
||||
__be16 *ethtype;
|
||||
|
||||
/* Detect inline metadata */
|
||||
if (skb->len < ETH_HLEN + MLX5E_METADATA_ETHER_LEN)
|
||||
return skb;
|
||||
ethtype = (__be16 *)(skb->data + ETH_ALEN * 2);
|
||||
if (*ethtype != cpu_to_be16(MLX5E_METADATA_ETHER_TYPE))
|
||||
if (!is_metadata_hdr_valid(skb))
|
||||
return skb;
|
||||
|
||||
/* Use the metadata */
|
||||
@ -369,12 +363,7 @@ struct sk_buff *mlx5e_ipsec_handle_rx_skb(struct net_device *netdev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
remove_metadata_hdr(skb);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
@ -33,6 +33,8 @@
|
||||
|
||||
#include "en_accel/tls.h"
|
||||
#include "en_accel/tls_rxtx.h"
|
||||
#include "accel/accel.h"
|
||||
|
||||
#include <net/inet6_hashtables.h>
|
||||
#include <linux/ipv6.h>
|
||||
|
||||
@ -350,16 +352,9 @@ void mlx5e_tls_handle_rx_skb(struct net_device *netdev, struct sk_buff *skb,
|
||||
u32 *cqe_bcnt)
|
||||
{
|
||||
struct mlx5e_tls_metadata *mdata;
|
||||
struct ethhdr *old_eth;
|
||||
struct ethhdr *new_eth;
|
||||
__be16 *ethtype;
|
||||
struct mlx5e_priv *priv;
|
||||
|
||||
/* Detect inline metadata */
|
||||
if (skb->len < ETH_HLEN + MLX5E_METADATA_ETHER_LEN)
|
||||
return;
|
||||
ethtype = (__be16 *)(skb->data + ETH_ALEN * 2);
|
||||
if (*ethtype != cpu_to_be16(MLX5E_METADATA_ETHER_TYPE))
|
||||
if (!is_metadata_hdr_valid(skb))
|
||||
return;
|
||||
|
||||
/* Use the metadata */
|
||||
@ -383,11 +378,6 @@ void mlx5e_tls_handle_rx_skb(struct net_device *netdev, struct sk_buff *skb,
|
||||
return;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
remove_metadata_hdr(skb);
|
||||
*cqe_bcnt -= MLX5E_METADATA_ETHER_LEN;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user