|
10 | 10 | #include "lib/fs_chains.h" |
11 | 11 |
|
12 | 12 | #define NUM_IPSEC_FTE BIT(15) |
| 13 | +#define MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE 16 |
13 | 14 |
|
14 | 15 | struct mlx5e_ipsec_fc { |
15 | 16 | struct mlx5_fc *cnt; |
@@ -836,40 +837,80 @@ static int setup_modify_header(struct mlx5_core_dev *mdev, u32 val, u8 dir, |
836 | 837 | return 0; |
837 | 838 | } |
838 | 839 |
|
| 840 | +static int |
| 841 | +setup_pkt_transport_reformat(struct mlx5_accel_esp_xfrm_attrs *attrs, |
| 842 | + struct mlx5_pkt_reformat_params *reformat_params) |
| 843 | +{ |
| 844 | + u8 *reformatbf; |
| 845 | + __be32 spi; |
| 846 | + |
| 847 | + switch (attrs->dir) { |
| 848 | + case XFRM_DEV_OFFLOAD_IN: |
| 849 | + reformat_params->type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT; |
| 850 | + break; |
| 851 | + case XFRM_DEV_OFFLOAD_OUT: |
| 852 | + if (attrs->family == AF_INET) |
| 853 | + reformat_params->type = |
| 854 | + MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4; |
| 855 | + else |
| 856 | + reformat_params->type = |
| 857 | + MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6; |
| 858 | + |
| 859 | + reformatbf = kzalloc(MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE, |
| 860 | + GFP_KERNEL); |
| 861 | + if (!reformatbf) |
| 862 | + return -ENOMEM; |
| 863 | + |
| 864 | + /* convert to network format */ |
| 865 | + spi = htonl(attrs->spi); |
| 866 | + memcpy(reformatbf, &spi, sizeof(spi)); |
| 867 | + |
| 868 | + reformat_params->param_0 = attrs->authsize; |
| 869 | + reformat_params->size = |
| 870 | + MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_SIZE; |
| 871 | + reformat_params->data = reformatbf; |
| 872 | + break; |
| 873 | + default: |
| 874 | + return -EINVAL; |
| 875 | + } |
| 876 | + |
| 877 | + return 0; |
| 878 | +} |
| 879 | + |
839 | 880 | static int setup_pkt_reformat(struct mlx5_core_dev *mdev, |
840 | 881 | struct mlx5_accel_esp_xfrm_attrs *attrs, |
841 | 882 | struct mlx5_flow_act *flow_act) |
842 | 883 | { |
843 | | - enum mlx5_flow_namespace_type ns_type = MLX5_FLOW_NAMESPACE_EGRESS; |
844 | 884 | struct mlx5_pkt_reformat_params reformat_params = {}; |
845 | 885 | struct mlx5_pkt_reformat *pkt_reformat; |
846 | | - u8 reformatbf[16] = {}; |
847 | | - __be32 spi; |
| 886 | + enum mlx5_flow_namespace_type ns_type; |
| 887 | + int ret; |
848 | 888 |
|
849 | | - if (attrs->dir == XFRM_DEV_OFFLOAD_IN) { |
850 | | - reformat_params.type = MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT; |
| 889 | + switch (attrs->dir) { |
| 890 | + case XFRM_DEV_OFFLOAD_IN: |
851 | 891 | ns_type = MLX5_FLOW_NAMESPACE_KERNEL; |
852 | | - goto cmd; |
| 892 | + break; |
| 893 | + case XFRM_DEV_OFFLOAD_OUT: |
| 894 | + ns_type = MLX5_FLOW_NAMESPACE_EGRESS; |
| 895 | + break; |
| 896 | + default: |
| 897 | + return -EINVAL; |
853 | 898 | } |
854 | 899 |
|
855 | | - if (attrs->family == AF_INET) |
856 | | - reformat_params.type = |
857 | | - MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4; |
858 | | - else |
859 | | - reformat_params.type = |
860 | | - MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6; |
861 | | - |
862 | | - /* convert to network format */ |
863 | | - spi = htonl(attrs->spi); |
864 | | - memcpy(reformatbf, &spi, 4); |
| 900 | + switch (attrs->mode) { |
| 901 | + case XFRM_MODE_TRANSPORT: |
| 902 | + ret = setup_pkt_transport_reformat(attrs, &reformat_params); |
| 903 | + break; |
| 904 | + default: |
| 905 | + ret = -EINVAL; |
| 906 | + } |
865 | 907 |
|
866 | | - reformat_params.param_0 = attrs->authsize; |
867 | | - reformat_params.size = sizeof(reformatbf); |
868 | | - reformat_params.data = &reformatbf; |
| 908 | + if (ret) |
| 909 | + return ret; |
869 | 910 |
|
870 | | -cmd: |
871 | 911 | pkt_reformat = |
872 | 912 | mlx5_packet_reformat_alloc(mdev, &reformat_params, ns_type); |
| 913 | + kfree(reformat_params.data); |
873 | 914 | if (IS_ERR(pkt_reformat)) |
874 | 915 | return PTR_ERR(pkt_reformat); |
875 | 916 |
|
|
0 commit comments