hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
....@@ -57,7 +57,7 @@
5757 struct completion complete;
5858 struct mlx5_fpga_device *dev;
5959 struct list_head list; /* Item in pending_cmds */
60
- u8 command[0];
60
+ u8 command[];
6161 };
6262
6363 struct mlx5_fpga_esp_xfrm;
....@@ -65,6 +65,7 @@
6565 struct mlx5_fpga_ipsec_sa_ctx {
6666 struct rhash_head hash;
6767 struct mlx5_ifc_fpga_ipsec_sa hw_sa;
68
+ u32 sa_handle;
6869 struct mlx5_core_dev *dev;
6970 struct mlx5_fpga_esp_xfrm *fpga_xfrm;
7071 };
....@@ -87,10 +88,10 @@
8788 * value is not constant during the lifetime
8889 * of the key object.
8990 */
90
- .key_len = FIELD_SIZEOF(struct mlx5_fpga_ipsec_sa_ctx, hw_sa) -
91
- FIELD_SIZEOF(struct mlx5_ifc_fpga_ipsec_sa_v1, cmd),
91
+ .key_len = sizeof_field(struct mlx5_fpga_ipsec_sa_ctx, hw_sa) -
92
+ sizeof_field(struct mlx5_ifc_fpga_ipsec_sa_v1, cmd),
9293 .key_offset = offsetof(struct mlx5_fpga_ipsec_sa_ctx, hw_sa) +
93
- FIELD_SIZEOF(struct mlx5_ifc_fpga_ipsec_sa_v1, cmd),
94
+ sizeof_field(struct mlx5_ifc_fpga_ipsec_sa_v1, cmd),
9495 .head_offset = offsetof(struct mlx5_fpga_ipsec_sa_ctx, hash),
9596 .automatic_shrinking = true,
9697 .min_size = 1,
....@@ -119,6 +120,8 @@
119120 */
120121 struct rb_root rules_rb;
121122 struct mutex rules_rb_lock; /* rules lock */
123
+
124
+ struct ida halloc;
122125 };
123126
124127 static bool mlx5_fpga_is_ipsec_device(struct mlx5_core_dev *mdev)
....@@ -356,7 +359,7 @@
356359 return ret;
357360 }
358361
359
-unsigned int mlx5_fpga_ipsec_counters_count(struct mlx5_core_dev *mdev)
362
+static unsigned int mlx5_fpga_ipsec_counters_count(struct mlx5_core_dev *mdev)
360363 {
361364 struct mlx5_fpga_device *fdev = mdev->fpga;
362365
....@@ -367,8 +370,8 @@
367370 number_of_ipsec_counters);
368371 }
369372
370
-int mlx5_fpga_ipsec_counters_read(struct mlx5_core_dev *mdev, u64 *counters,
371
- unsigned int counters_count)
373
+static int mlx5_fpga_ipsec_counters_read(struct mlx5_core_dev *mdev, u64 *counters,
374
+ unsigned int counters_count)
372375 {
373376 struct mlx5_fpga_device *fdev = mdev->fpga;
374377 unsigned int i;
....@@ -602,7 +605,7 @@
602605 const u32 *match_c,
603606 const u32 *match_v)
604607 {
605
- u32 ipsec_dev_caps = mlx5_accel_ipsec_device_caps(dev);
608
+ u32 ipsec_dev_caps = mlx5_fpga_ipsec_device_caps(dev);
606609 bool ipv6_flow;
607610
608611 ipv6_flow = mlx5_fs_is_outer_ipv6_flow(dev, match_c, match_v);
....@@ -636,7 +639,8 @@
636639 u8 match_criteria_enable,
637640 const u32 *match_c,
638641 const u32 *match_v,
639
- struct mlx5_flow_act *flow_act)
642
+ struct mlx5_flow_act *flow_act,
643
+ struct mlx5_flow_context *flow_context)
640644 {
641645 const void *outer_c = MLX5_ADDR_OF(fte_match_param, match_c,
642646 outer_headers);
....@@ -655,17 +659,16 @@
655659 (match_criteria_enable &
656660 ~(MLX5_MATCH_OUTER_HEADERS | MLX5_MATCH_MISC_PARAMETERS)) ||
657661 (flow_act->action & ~(MLX5_FLOW_CONTEXT_ACTION_ENCRYPT | MLX5_FLOW_CONTEXT_ACTION_ALLOW)) ||
658
- flow_act->has_flow_tag)
662
+ (flow_context->flags & FLOW_CONTEXT_HAS_TAG))
659663 return false;
660664
661665 return true;
662666 }
663667
664
-void *mlx5_fpga_ipsec_create_sa_ctx(struct mlx5_core_dev *mdev,
665
- struct mlx5_accel_esp_xfrm *accel_xfrm,
666
- const __be32 saddr[4],
667
- const __be32 daddr[4],
668
- const __be32 spi, bool is_ipv6)
668
+static void *mlx5_fpga_ipsec_create_sa_ctx(struct mlx5_core_dev *mdev,
669
+ struct mlx5_accel_esp_xfrm *accel_xfrm,
670
+ const __be32 saddr[4], const __be32 daddr[4],
671
+ const __be32 spi, bool is_ipv6, u32 *sa_handle)
669672 {
670673 struct mlx5_fpga_ipsec_sa_ctx *sa_ctx;
671674 struct mlx5_fpga_esp_xfrm *fpga_xfrm =
....@@ -703,6 +706,17 @@
703706 goto exists;
704707 }
705708
709
+ if (accel_xfrm->attrs.action == MLX5_ACCEL_ESP_ACTION_DECRYPT) {
710
+ err = ida_simple_get(&fipsec->halloc, 1, 0, GFP_KERNEL);
711
+ if (err < 0) {
712
+ context = ERR_PTR(err);
713
+ goto exists;
714
+ }
715
+
716
+ sa_ctx->sa_handle = err;
717
+ if (sa_handle)
718
+ *sa_handle = sa_ctx->sa_handle;
719
+ }
706720 /* This is unbounded fpga_xfrm, try to add to hash */
707721 mutex_lock(&fipsec->sa_hash_lock);
708722
....@@ -743,7 +757,8 @@
743757 rhash_sa));
744758 unlock_hash:
745759 mutex_unlock(&fipsec->sa_hash_lock);
746
-
760
+ if (accel_xfrm->attrs.action == MLX5_ACCEL_ESP_ACTION_DECRYPT)
761
+ ida_simple_remove(&fipsec->halloc, sa_ctx->sa_handle);
747762 exists:
748763 mutex_unlock(&fpga_xfrm->lock);
749764 kfree(sa_ctx);
....@@ -767,7 +782,8 @@
767782 fg->mask.match_criteria_enable,
768783 fg->mask.match_criteria,
769784 fte->val,
770
- &fte->action))
785
+ &fte->action,
786
+ &fte->flow_context))
771787 return ERR_PTR(-EINVAL);
772788 else if (!mlx5_is_fpga_ipsec_rule(mdev,
773789 fg->mask.match_criteria_enable,
....@@ -814,7 +830,7 @@
814830 /* create */
815831 return mlx5_fpga_ipsec_create_sa_ctx(mdev, accel_xfrm,
816832 saddr, daddr,
817
- spi, is_ipv6);
833
+ spi, is_ipv6, NULL);
818834 }
819835
820836 static void
....@@ -834,13 +850,17 @@
834850 return;
835851 }
836852
853
+ if (sa_ctx->fpga_xfrm->accel_xfrm.attrs.action ==
854
+ MLX5_ACCEL_ESP_ACTION_DECRYPT)
855
+ ida_simple_remove(&fipsec->halloc, sa_ctx->sa_handle);
856
+
837857 mutex_lock(&fipsec->sa_hash_lock);
838858 WARN_ON(rhashtable_remove_fast(&fipsec->sa_hash, &sa_ctx->hash,
839859 rhash_sa));
840860 mutex_unlock(&fipsec->sa_hash_lock);
841861 }
842862
843
-void mlx5_fpga_ipsec_delete_sa_ctx(void *context)
863
+static void mlx5_fpga_ipsec_delete_sa_ctx(void *context)
844864 {
845865 struct mlx5_fpga_esp_xfrm *fpga_xfrm =
846866 ((struct mlx5_fpga_ipsec_sa_ctx *)context)->fpga_xfrm;
....@@ -990,32 +1010,33 @@
9901010 return egress ? FS_FT_NIC_TX : FS_FT_NIC_RX;
9911011 }
9921012
993
-static int fpga_ipsec_fs_create_flow_group(struct mlx5_core_dev *dev,
1013
+static int fpga_ipsec_fs_create_flow_group(struct mlx5_flow_root_namespace *ns,
9941014 struct mlx5_flow_table *ft,
9951015 u32 *in,
996
- unsigned int *group_id,
1016
+ struct mlx5_flow_group *fg,
9971017 bool is_egress)
9981018 {
999
- int (*create_flow_group)(struct mlx5_core_dev *dev,
1019
+ int (*create_flow_group)(struct mlx5_flow_root_namespace *ns,
10001020 struct mlx5_flow_table *ft, u32 *in,
1001
- unsigned int *group_id) =
1021
+ struct mlx5_flow_group *fg) =
10021022 mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->create_flow_group;
10031023 char *misc_params_c = MLX5_ADDR_OF(create_flow_group_in, in,
10041024 match_criteria.misc_parameters);
1025
+ struct mlx5_core_dev *dev = ns->dev;
10051026 u32 saved_outer_esp_spi_mask;
10061027 u8 match_criteria_enable;
10071028 int ret;
10081029
10091030 if (MLX5_CAP_FLOWTABLE(dev,
10101031 flow_table_properties_nic_receive.ft_field_support.outer_esp_spi))
1011
- return create_flow_group(dev, ft, in, group_id);
1032
+ return create_flow_group(ns, ft, in, fg);
10121033
10131034 match_criteria_enable =
10141035 MLX5_GET(create_flow_group_in, in, match_criteria_enable);
10151036 saved_outer_esp_spi_mask =
10161037 MLX5_GET(fte_match_set_misc, misc_params_c, outer_esp_spi);
10171038 if (!match_criteria_enable || !saved_outer_esp_spi_mask)
1018
- return create_flow_group(dev, ft, in, group_id);
1039
+ return create_flow_group(ns, ft, in, fg);
10191040
10201041 MLX5_SET(fte_match_set_misc, misc_params_c, outer_esp_spi, 0);
10211042
....@@ -1024,7 +1045,7 @@
10241045 MLX5_SET(create_flow_group_in, in, match_criteria_enable,
10251046 match_criteria_enable & ~MLX5_MATCH_MISC_PARAMETERS);
10261047
1027
- ret = create_flow_group(dev, ft, in, group_id);
1048
+ ret = create_flow_group(ns, ft, in, fg);
10281049
10291050 MLX5_SET(fte_match_set_misc, misc_params_c, outer_esp_spi, saved_outer_esp_spi_mask);
10301051 MLX5_SET(create_flow_group_in, in, match_criteria_enable, match_criteria_enable);
....@@ -1032,17 +1053,18 @@
10321053 return ret;
10331054 }
10341055
1035
-static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
1056
+static int fpga_ipsec_fs_create_fte(struct mlx5_flow_root_namespace *ns,
10361057 struct mlx5_flow_table *ft,
10371058 struct mlx5_flow_group *fg,
10381059 struct fs_fte *fte,
10391060 bool is_egress)
10401061 {
1041
- int (*create_fte)(struct mlx5_core_dev *dev,
1062
+ int (*create_fte)(struct mlx5_flow_root_namespace *ns,
10421063 struct mlx5_flow_table *ft,
10431064 struct mlx5_flow_group *fg,
10441065 struct fs_fte *fte) =
10451066 mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->create_fte;
1067
+ struct mlx5_core_dev *dev = ns->dev;
10461068 struct mlx5_fpga_device *fdev = dev->fpga;
10471069 struct mlx5_fpga_ipsec *fipsec = fdev->ipsec;
10481070 struct mlx5_fpga_ipsec_rule *rule;
....@@ -1054,7 +1076,7 @@
10541076 !(fte->action.action &
10551077 (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
10561078 MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
1057
- return create_fte(dev, ft, fg, fte);
1079
+ return create_fte(ns, ft, fg, fte);
10581080
10591081 rule = kzalloc(sizeof(*rule), GFP_KERNEL);
10601082 if (!rule)
....@@ -1071,7 +1093,7 @@
10711093 WARN_ON(rule_insert(fipsec, rule));
10721094
10731095 modify_spec_mailbox(dev, fte, &mbox_mod);
1074
- ret = create_fte(dev, ft, fg, fte);
1096
+ ret = create_fte(ns, ft, fg, fte);
10751097 restore_spec_mailbox(fte, &mbox_mod);
10761098 if (ret) {
10771099 _rule_delete(fipsec, rule);
....@@ -1082,19 +1104,20 @@
10821104 return ret;
10831105 }
10841106
1085
-static int fpga_ipsec_fs_update_fte(struct mlx5_core_dev *dev,
1107
+static int fpga_ipsec_fs_update_fte(struct mlx5_flow_root_namespace *ns,
10861108 struct mlx5_flow_table *ft,
1087
- unsigned int group_id,
1109
+ struct mlx5_flow_group *fg,
10881110 int modify_mask,
10891111 struct fs_fte *fte,
10901112 bool is_egress)
10911113 {
1092
- int (*update_fte)(struct mlx5_core_dev *dev,
1114
+ int (*update_fte)(struct mlx5_flow_root_namespace *ns,
10931115 struct mlx5_flow_table *ft,
1094
- unsigned int group_id,
1116
+ struct mlx5_flow_group *fg,
10951117 int modify_mask,
10961118 struct fs_fte *fte) =
10971119 mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->update_fte;
1120
+ struct mlx5_core_dev *dev = ns->dev;
10981121 bool is_esp = fte->action.esp_id;
10991122 struct mailbox_mod mbox_mod;
11001123 int ret;
....@@ -1103,24 +1126,25 @@
11031126 !(fte->action.action &
11041127 (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
11051128 MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
1106
- return update_fte(dev, ft, group_id, modify_mask, fte);
1129
+ return update_fte(ns, ft, fg, modify_mask, fte);
11071130
11081131 modify_spec_mailbox(dev, fte, &mbox_mod);
1109
- ret = update_fte(dev, ft, group_id, modify_mask, fte);
1132
+ ret = update_fte(ns, ft, fg, modify_mask, fte);
11101133 restore_spec_mailbox(fte, &mbox_mod);
11111134
11121135 return ret;
11131136 }
11141137
1115
-static int fpga_ipsec_fs_delete_fte(struct mlx5_core_dev *dev,
1138
+static int fpga_ipsec_fs_delete_fte(struct mlx5_flow_root_namespace *ns,
11161139 struct mlx5_flow_table *ft,
11171140 struct fs_fte *fte,
11181141 bool is_egress)
11191142 {
1120
- int (*delete_fte)(struct mlx5_core_dev *dev,
1143
+ int (*delete_fte)(struct mlx5_flow_root_namespace *ns,
11211144 struct mlx5_flow_table *ft,
11221145 struct fs_fte *fte) =
11231146 mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->delete_fte;
1147
+ struct mlx5_core_dev *dev = ns->dev;
11241148 struct mlx5_fpga_device *fdev = dev->fpga;
11251149 struct mlx5_fpga_ipsec *fipsec = fdev->ipsec;
11261150 struct mlx5_fpga_ipsec_rule *rule;
....@@ -1132,7 +1156,7 @@
11321156 !(fte->action.action &
11331157 (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
11341158 MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
1135
- return delete_fte(dev, ft, fte);
1159
+ return delete_fte(ns, ft, fte);
11361160
11371161 rule = rule_search(fipsec, fte);
11381162 if (!rule)
....@@ -1142,84 +1166,84 @@
11421166 rule_delete(fipsec, rule);
11431167
11441168 modify_spec_mailbox(dev, fte, &mbox_mod);
1145
- ret = delete_fte(dev, ft, fte);
1169
+ ret = delete_fte(ns, ft, fte);
11461170 restore_spec_mailbox(fte, &mbox_mod);
11471171
11481172 return ret;
11491173 }
11501174
11511175 static int
1152
-mlx5_fpga_ipsec_fs_create_flow_group_egress(struct mlx5_core_dev *dev,
1176
+mlx5_fpga_ipsec_fs_create_flow_group_egress(struct mlx5_flow_root_namespace *ns,
11531177 struct mlx5_flow_table *ft,
11541178 u32 *in,
1155
- unsigned int *group_id)
1179
+ struct mlx5_flow_group *fg)
11561180 {
1157
- return fpga_ipsec_fs_create_flow_group(dev, ft, in, group_id, true);
1181
+ return fpga_ipsec_fs_create_flow_group(ns, ft, in, fg, true);
11581182 }
11591183
11601184 static int
1161
-mlx5_fpga_ipsec_fs_create_fte_egress(struct mlx5_core_dev *dev,
1185
+mlx5_fpga_ipsec_fs_create_fte_egress(struct mlx5_flow_root_namespace *ns,
11621186 struct mlx5_flow_table *ft,
11631187 struct mlx5_flow_group *fg,
11641188 struct fs_fte *fte)
11651189 {
1166
- return fpga_ipsec_fs_create_fte(dev, ft, fg, fte, true);
1190
+ return fpga_ipsec_fs_create_fte(ns, ft, fg, fte, true);
11671191 }
11681192
11691193 static int
1170
-mlx5_fpga_ipsec_fs_update_fte_egress(struct mlx5_core_dev *dev,
1194
+mlx5_fpga_ipsec_fs_update_fte_egress(struct mlx5_flow_root_namespace *ns,
11711195 struct mlx5_flow_table *ft,
1172
- unsigned int group_id,
1196
+ struct mlx5_flow_group *fg,
11731197 int modify_mask,
11741198 struct fs_fte *fte)
11751199 {
1176
- return fpga_ipsec_fs_update_fte(dev, ft, group_id, modify_mask, fte,
1200
+ return fpga_ipsec_fs_update_fte(ns, ft, fg, modify_mask, fte,
11771201 true);
11781202 }
11791203
11801204 static int
1181
-mlx5_fpga_ipsec_fs_delete_fte_egress(struct mlx5_core_dev *dev,
1205
+mlx5_fpga_ipsec_fs_delete_fte_egress(struct mlx5_flow_root_namespace *ns,
11821206 struct mlx5_flow_table *ft,
11831207 struct fs_fte *fte)
11841208 {
1185
- return fpga_ipsec_fs_delete_fte(dev, ft, fte, true);
1209
+ return fpga_ipsec_fs_delete_fte(ns, ft, fte, true);
11861210 }
11871211
11881212 static int
1189
-mlx5_fpga_ipsec_fs_create_flow_group_ingress(struct mlx5_core_dev *dev,
1213
+mlx5_fpga_ipsec_fs_create_flow_group_ingress(struct mlx5_flow_root_namespace *ns,
11901214 struct mlx5_flow_table *ft,
11911215 u32 *in,
1192
- unsigned int *group_id)
1216
+ struct mlx5_flow_group *fg)
11931217 {
1194
- return fpga_ipsec_fs_create_flow_group(dev, ft, in, group_id, false);
1218
+ return fpga_ipsec_fs_create_flow_group(ns, ft, in, fg, false);
11951219 }
11961220
11971221 static int
1198
-mlx5_fpga_ipsec_fs_create_fte_ingress(struct mlx5_core_dev *dev,
1222
+mlx5_fpga_ipsec_fs_create_fte_ingress(struct mlx5_flow_root_namespace *ns,
11991223 struct mlx5_flow_table *ft,
12001224 struct mlx5_flow_group *fg,
12011225 struct fs_fte *fte)
12021226 {
1203
- return fpga_ipsec_fs_create_fte(dev, ft, fg, fte, false);
1227
+ return fpga_ipsec_fs_create_fte(ns, ft, fg, fte, false);
12041228 }
12051229
12061230 static int
1207
-mlx5_fpga_ipsec_fs_update_fte_ingress(struct mlx5_core_dev *dev,
1231
+mlx5_fpga_ipsec_fs_update_fte_ingress(struct mlx5_flow_root_namespace *ns,
12081232 struct mlx5_flow_table *ft,
1209
- unsigned int group_id,
1233
+ struct mlx5_flow_group *fg,
12101234 int modify_mask,
12111235 struct fs_fte *fte)
12121236 {
1213
- return fpga_ipsec_fs_update_fte(dev, ft, group_id, modify_mask, fte,
1237
+ return fpga_ipsec_fs_update_fte(ns, ft, fg, modify_mask, fte,
12141238 false);
12151239 }
12161240
12171241 static int
1218
-mlx5_fpga_ipsec_fs_delete_fte_ingress(struct mlx5_core_dev *dev,
1242
+mlx5_fpga_ipsec_fs_delete_fte_ingress(struct mlx5_flow_root_namespace *ns,
12191243 struct mlx5_flow_table *ft,
12201244 struct fs_fte *fte)
12211245 {
1222
- return fpga_ipsec_fs_delete_fte(dev, ft, fte, false);
1246
+ return fpga_ipsec_fs_delete_fte(ns, ft, fte, false);
12231247 }
12241248
12251249 static struct mlx5_flow_cmds fpga_ipsec_ingress;
....@@ -1238,7 +1262,7 @@
12381262 }
12391263 }
12401264
1241
-int mlx5_fpga_ipsec_init(struct mlx5_core_dev *mdev)
1265
+static int mlx5_fpga_ipsec_init(struct mlx5_core_dev *mdev)
12421266 {
12431267 struct mlx5_fpga_conn_attr init_attr = {0};
12441268 struct mlx5_fpga_device *fdev = mdev->fpga;
....@@ -1293,6 +1317,8 @@
12931317 goto err_destroy_hash;
12941318 }
12951319
1320
+ ida_init(&fdev->ipsec->halloc);
1321
+
12961322 return 0;
12971323
12981324 err_destroy_hash:
....@@ -1318,13 +1344,14 @@
13181344 }
13191345 }
13201346
1321
-void mlx5_fpga_ipsec_cleanup(struct mlx5_core_dev *mdev)
1347
+static void mlx5_fpga_ipsec_cleanup(struct mlx5_core_dev *mdev)
13221348 {
13231349 struct mlx5_fpga_device *fdev = mdev->fpga;
13241350
13251351 if (!mlx5_fpga_is_ipsec_device(mdev))
13261352 return;
13271353
1354
+ ida_destroy(&fdev->ipsec->halloc);
13281355 destroy_rules_rb(&fdev->ipsec->rules_rb);
13291356 rhashtable_destroy(&fdev->ipsec->sa_hash);
13301357
....@@ -1422,7 +1449,7 @@
14221449 return 0;
14231450 }
14241451
1425
-struct mlx5_accel_esp_xfrm *
1452
+static struct mlx5_accel_esp_xfrm *
14261453 mlx5_fpga_esp_create_xfrm(struct mlx5_core_dev *mdev,
14271454 const struct mlx5_accel_esp_xfrm_attrs *attrs,
14281455 u32 flags)
....@@ -1450,7 +1477,7 @@
14501477 return &fpga_xfrm->accel_xfrm;
14511478 }
14521479
1453
-void mlx5_fpga_esp_destroy_xfrm(struct mlx5_accel_esp_xfrm *xfrm)
1480
+static void mlx5_fpga_esp_destroy_xfrm(struct mlx5_accel_esp_xfrm *xfrm)
14541481 {
14551482 struct mlx5_fpga_esp_xfrm *fpga_xfrm =
14561483 container_of(xfrm, struct mlx5_fpga_esp_xfrm,
....@@ -1459,8 +1486,8 @@
14591486 kfree(fpga_xfrm);
14601487 }
14611488
1462
-int mlx5_fpga_esp_modify_xfrm(struct mlx5_accel_esp_xfrm *xfrm,
1463
- const struct mlx5_accel_esp_xfrm_attrs *attrs)
1489
+static int mlx5_fpga_esp_modify_xfrm(struct mlx5_accel_esp_xfrm *xfrm,
1490
+ const struct mlx5_accel_esp_xfrm_attrs *attrs)
14641491 {
14651492 struct mlx5_core_dev *mdev = xfrm->mdev;
14661493 struct mlx5_fpga_device *fdev = mdev->fpga;
....@@ -1531,3 +1558,24 @@
15311558 mutex_unlock(&fpga_xfrm->lock);
15321559 return err;
15331560 }
1561
+
1562
+static const struct mlx5_accel_ipsec_ops fpga_ipsec_ops = {
1563
+ .device_caps = mlx5_fpga_ipsec_device_caps,
1564
+ .counters_count = mlx5_fpga_ipsec_counters_count,
1565
+ .counters_read = mlx5_fpga_ipsec_counters_read,
1566
+ .create_hw_context = mlx5_fpga_ipsec_create_sa_ctx,
1567
+ .free_hw_context = mlx5_fpga_ipsec_delete_sa_ctx,
1568
+ .init = mlx5_fpga_ipsec_init,
1569
+ .cleanup = mlx5_fpga_ipsec_cleanup,
1570
+ .esp_create_xfrm = mlx5_fpga_esp_create_xfrm,
1571
+ .esp_modify_xfrm = mlx5_fpga_esp_modify_xfrm,
1572
+ .esp_destroy_xfrm = mlx5_fpga_esp_destroy_xfrm,
1573
+};
1574
+
1575
+const struct mlx5_accel_ipsec_ops *mlx5_fpga_ipsec_ops(struct mlx5_core_dev *mdev)
1576
+{
1577
+ if (!mlx5_fpga_is_ipsec_device(mdev))
1578
+ return NULL;
1579
+
1580
+ return &fpga_ipsec_ops;
1581
+}