Skip to content

Commit 37a417c

Browse files
rleonkuba-moo
authored andcommitted
net/mlx5e: Support IPsec RX packet offload in tunnel mode
Extend mlx5 driver with logic to support IPsec RX packet offload in tunnel mode. Signed-off-by: Leon Romanovsky <[email protected]> Reviewed-by: Simon Horman <[email protected]> Reviewed-by: Sridhar Samudrala <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 6480a3b commit 37a417c

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,41 @@ static void mlx5e_ipsec_init_limits(struct mlx5e_ipsec_sa_entry *sa_entry,
242242
attrs->lft.numb_rounds_soft = (u64)n;
243243
}
244244

245+
static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
246+
struct mlx5_accel_esp_xfrm_attrs *attrs)
247+
{
248+
struct mlx5_core_dev *mdev = mlx5e_ipsec_sa2dev(sa_entry);
249+
struct xfrm_state *x = sa_entry->x;
250+
struct net_device *netdev;
251+
struct neighbour *n;
252+
u8 addr[ETH_ALEN];
253+
254+
if (attrs->mode != XFRM_MODE_TUNNEL &&
255+
attrs->type != XFRM_DEV_OFFLOAD_PACKET)
256+
return;
257+
258+
netdev = x->xso.real_dev;
259+
260+
mlx5_query_mac_address(mdev, addr);
261+
switch (attrs->dir) {
262+
case XFRM_DEV_OFFLOAD_IN:
263+
ether_addr_copy(attrs->dmac, addr);
264+
n = neigh_lookup(&arp_tbl, &attrs->saddr.a4, netdev);
265+
if (!n) {
266+
n = neigh_create(&arp_tbl, &attrs->saddr.a4, netdev);
267+
if (IS_ERR(n))
268+
return;
269+
neigh_event_send(n, NULL);
270+
}
271+
neigh_ha_snapshot(addr, n, netdev);
272+
ether_addr_copy(attrs->smac, addr);
273+
break;
274+
default:
275+
return;
276+
}
277+
neigh_release(n);
278+
}
279+
245280
void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
246281
struct mlx5_accel_esp_xfrm_attrs *attrs)
247282
{
@@ -300,6 +335,7 @@ void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
300335
attrs->mode = x->props.mode;
301336

302337
mlx5e_ipsec_init_limits(sa_entry, attrs);
338+
mlx5e_ipsec_init_macs(sa_entry, attrs);
303339
}
304340

305341
static int mlx5e_xfrm_validate_state(struct mlx5_core_dev *mdev,

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ struct mlx5_accel_esp_xfrm_attrs {
9999
u32 authsize;
100100
u32 reqid;
101101
struct mlx5_ipsec_lft lft;
102+
u8 smac[ETH_ALEN];
103+
u8 dmac[ETH_ALEN];
102104
};
103105

104106
enum mlx5_ipsec_cap {

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,53 @@ static int setup_modify_header(struct mlx5_core_dev *mdev, u32 val, u8 dir,
837837
return 0;
838838
}
839839

840+
static int
841+
setup_pkt_tunnel_reformat(struct mlx5_core_dev *mdev,
842+
struct mlx5_accel_esp_xfrm_attrs *attrs,
843+
struct mlx5_pkt_reformat_params *reformat_params)
844+
{
845+
struct ethhdr *eth_hdr;
846+
char *reformatbf;
847+
size_t bfflen;
848+
849+
bfflen = sizeof(*eth_hdr);
850+
851+
reformatbf = kzalloc(bfflen, GFP_KERNEL);
852+
if (!reformatbf)
853+
return -ENOMEM;
854+
855+
eth_hdr = (struct ethhdr *)reformatbf;
856+
switch (attrs->family) {
857+
case AF_INET:
858+
eth_hdr->h_proto = htons(ETH_P_IP);
859+
break;
860+
case AF_INET6:
861+
eth_hdr->h_proto = htons(ETH_P_IPV6);
862+
break;
863+
default:
864+
goto free_reformatbf;
865+
}
866+
867+
ether_addr_copy(eth_hdr->h_dest, attrs->dmac);
868+
ether_addr_copy(eth_hdr->h_source, attrs->smac);
869+
870+
switch (attrs->dir) {
871+
case XFRM_DEV_OFFLOAD_IN:
872+
reformat_params->type = MLX5_REFORMAT_TYPE_L3_ESP_TUNNEL_TO_L2;
873+
break;
874+
default:
875+
goto free_reformatbf;
876+
}
877+
878+
reformat_params->size = bfflen;
879+
reformat_params->data = reformatbf;
880+
return 0;
881+
882+
free_reformatbf:
883+
kfree(reformatbf);
884+
return -EINVAL;
885+
}
886+
840887
static int
841888
setup_pkt_transport_reformat(struct mlx5_accel_esp_xfrm_attrs *attrs,
842889
struct mlx5_pkt_reformat_params *reformat_params)
@@ -901,6 +948,9 @@ static int setup_pkt_reformat(struct mlx5_core_dev *mdev,
901948
case XFRM_MODE_TRANSPORT:
902949
ret = setup_pkt_transport_reformat(attrs, &reformat_params);
903950
break;
951+
case XFRM_MODE_TUNNEL:
952+
ret = setup_pkt_tunnel_reformat(mdev, attrs, &reformat_params);
953+
break;
904954
default:
905955
ret = -EINVAL;
906956
}

0 commit comments

Comments
 (0)