int mlx5_esw_ipsec_vf_offload_get(struct mlx5_core_dev *dev, struct mlx5_vport *vport)
{ int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out); void *hca_cap, *query_cap; bool ipsec_enabled; int err;
/* Querying IPsec caps only makes sense when generic ipsec_offload * HCA cap is enabled
*/
err = esw_ipsec_vf_query_generic(dev, vport->vport, &ipsec_enabled); if (err) return err;
if (vport->vport == MLX5_VPORT_PF) return -EOPNOTSUPP;
if (type == MLX5_ESW_VPORT_IPSEC_CRYPTO_OFFLOAD) {
err = esw_ipsec_vf_crypto_aux_caps_set(dev, vport->vport, enable); if (err) return err;
}
if (enable) {
err = esw_ipsec_vf_set_generic(dev, vport->vport, enable); if (err) return err;
err = esw_ipsec_vf_set_bytype(dev, vport, enable, type); if (err) return err;
} else {
err = esw_ipsec_vf_set_bytype(dev, vport, enable, type); if (err) return err;
err = mlx5_esw_ipsec_vf_offload_get(dev, vport); if (err) return err;
/* The generic ipsec_offload cap can be disabled only if both * ipsec_crypto_offload and ipsec_full_offload aren't enabled.
*/ if (!vport->info.ipsec_crypto_enabled &&
!vport->info.ipsec_packet_enabled) {
err = esw_ipsec_vf_set_generic(dev, vport->vport, enable); if (err) return err;
}
}
switch (type) { case MLX5_ESW_VPORT_IPSEC_CRYPTO_OFFLOAD:
vport->info.ipsec_crypto_enabled = enable; break; case MLX5_ESW_VPORT_IPSEC_PACKET_OFFLOAD:
vport->info.ipsec_packet_enabled = enable; break; default: return -EINVAL;
}
return 0;
}
staticint esw_ipsec_offload_supported(struct mlx5_core_dev *dev, u16 vport_num)
{ int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out); void *hca_cap, *query_cap; int ret;
query_cap = kvzalloc(query_sz, GFP_KERNEL); if (!query_cap) return -ENOMEM;
ret = mlx5_vport_get_other_func_cap(dev, vport_num, query_cap, MLX5_CAP_GENERAL); if (ret) goto free;
hca_cap = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability); if (!MLX5_GET(cmd_hca_cap, hca_cap, log_max_dek))
ret = -EOPNOTSUPP;
free:
kvfree(query_cap); return ret;
}
bool mlx5_esw_ipsec_vf_offload_supported(struct mlx5_core_dev *dev)
{ /* Old firmware doesn't support ipsec_offload capability for VFs. This * can be detected by checking reformat_add_esp_trasport capability - * when this cap isn't supported it means firmware cannot be trusted * about what it reports for ipsec_offload cap.
*/ return MLX5_CAP_FLOWTABLE_NIC_TX(dev, reformat_add_esp_trasport);
}
int mlx5_esw_ipsec_vf_crypto_offload_supported(struct mlx5_core_dev *dev,
u16 vport_num)
{ int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out); void *hca_cap, *query_cap; int err;
if (!mlx5_esw_ipsec_vf_offload_supported(dev)) return -EOPNOTSUPP;
err = esw_ipsec_offload_supported(dev, vport_num); if (err) return err;
query_cap = kvzalloc(query_sz, GFP_KERNEL); if (!query_cap) return -ENOMEM;
err = mlx5_vport_get_other_func_cap(dev, vport_num, query_cap, MLX5_CAP_ETHERNET_OFFLOADS); if (err) goto free;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.