File Index
Files and directories
Sign in
FILE

ipsec.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h C
  1/*
  2 * Copyright (c) 2017 Mellanox Technologies. All rights reserved.
  3 *
  4 * This software is available to you under a choice of one of two
  5 * licenses.  You may choose to be licensed under the terms of the GNU
  6 * General Public License (GPL) Version 2, available from the file
  7 * COPYING in the main directory of this source tree, or the
  8 * OpenIB.org BSD license below:
  9 *
 10 *     Redistribution and use in source and binary forms, with or
 11 *     without modification, are permitted provided that the following
 12 *     conditions are met:
 13 *
 14 *      - Redistributions of source code must retain the above
 15 *        copyright notice, this list of conditions and the following
 16 *        disclaimer.
 17 *
 18 *      - Redistributions in binary form must reproduce the above
 19 *        copyright notice, this list of conditions and the following
 20 *        disclaimer in the documentation and/or other materials
 21 *        provided with the distribution.
 22 *
 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 30 * SOFTWARE.
 31 *
 32 */
 33
 34#ifndef __MLX5E_IPSEC_H__
 35#define __MLX5E_IPSEC_H__
 36
 37#include <linux/mlx5/device.h>
 38#include <net/xfrm.h>
 39#include <linux/idr.h>
 40#include "lib/aso.h"
 41#include "lib/devcom.h"
 42
 43#define MLX5E_IPSEC_SADB_RX_BITS 10
 44#define MLX5E_IPSEC_ESN_SCOPE_MID 0x80000000L
 45
 46struct aes_gcm_keymat {
 47	u64   seq_iv;
 48
 49	u32   salt;
 50	u32   icv_len;
 51
 52	u32   key_len;
 53	u32   aes_key[256 / 32];
 54};
 55
 56struct upspec {
 57	u16 dport;
 58	u16 dport_mask;
 59	u16 sport;
 60	u16 sport_mask;
 61	u8 proto;
 62};
 63
 64struct mlx5_ipsec_lft {
 65	u64 hard_packet_limit;
 66	u64 soft_packet_limit;
 67	u64 numb_rounds_hard;
 68	u64 numb_rounds_soft;
 69};
 70
 71struct mlx5_replay_esn {
 72	u32 replay_window;
 73	u32 esn;
 74	u32 esn_msb;
 75	u8 overlap : 1;
 76	u8 trigger : 1;
 77};
 78
 79struct mlx5e_ipsec_addr {
 80	union {
 81		__be32 a4;
 82		__be32 a6[4];
 83	} saddr;
 84	union {
 85		__be32 m4;
 86		__be32 m6[4];
 87	} smask;
 88	union {
 89		__be32 a4;
 90		__be32 a6[4];
 91	} daddr;
 92	union {
 93		__be32 m4;
 94		__be32 m6[4];
 95	} dmask;
 96	u8 family;
 97};
 98
 99struct mlx5_accel_esp_xfrm_attrs {
100	u32   spi;
101	u32   mode;
102	struct aes_gcm_keymat aes_gcm;
103	struct mlx5e_ipsec_addr addrs;
104	struct upspec upspec;
105	u8 dir : 2;
106	u8 type : 2;
107	u8 drop : 1;
108	u8 encap : 1;
109	struct mlx5_replay_esn replay_esn;
110	u32 authsize;
111	u32 reqid;
112	struct mlx5_ipsec_lft lft;
113	union {
114		u8 smac[ETH_ALEN];
115		__be16 sport;
116	};
117	union {
118		u8 dmac[ETH_ALEN];
119		__be16 dport;
120	};
121};
122
123enum mlx5_ipsec_cap {
124	MLX5_IPSEC_CAP_CRYPTO		= 1 << 0,
125	MLX5_IPSEC_CAP_ESN		= 1 << 1,
126	MLX5_IPSEC_CAP_PACKET_OFFLOAD	= 1 << 2,
127	MLX5_IPSEC_CAP_ROCE             = 1 << 3,
128	MLX5_IPSEC_CAP_PRIO             = 1 << 4,
129	MLX5_IPSEC_CAP_TUNNEL           = 1 << 5,
130	MLX5_IPSEC_CAP_ESPINUDP         = 1 << 6,
131};
132
133struct mlx5e_priv;
134
135struct mlx5e_ipsec_hw_stats {
136	u64 ipsec_rx_pkts;
137	u64 ipsec_rx_bytes;
138	u64 ipsec_rx_drop_pkts;
139	u64 ipsec_rx_drop_bytes;
140	u64 ipsec_rx_drop_mismatch_sa_sel;
141	u64 ipsec_tx_pkts;
142	u64 ipsec_tx_bytes;
143	u64 ipsec_tx_drop_pkts;
144	u64 ipsec_tx_drop_bytes;
145};
146
147struct mlx5e_ipsec_sw_stats {
148	atomic64_t ipsec_rx_drop_sp_alloc;
149	atomic64_t ipsec_rx_drop_sadb_miss;
150	atomic64_t ipsec_tx_drop_bundle;
151	atomic64_t ipsec_tx_drop_no_state;
152	atomic64_t ipsec_tx_drop_not_ip;
153	atomic64_t ipsec_tx_drop_trailer;
154};
155
156struct mlx5e_ipsec_fc;
157struct mlx5e_ipsec_tx;
158
159struct mlx5e_ipsec_work {
160	struct work_struct work;
161	struct mlx5e_ipsec_sa_entry *sa_entry;
162	void *data;
163};
164
165struct mlx5e_ipsec_netevent_data {
166	u8 addr[ETH_ALEN];
167};
168
169struct mlx5e_ipsec_dwork {
170	struct delayed_work dwork;
171	struct mlx5e_ipsec_sa_entry *sa_entry;
172};
173
174struct mlx5e_ipsec_aso {
175	u8 __aligned(64) ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
176	dma_addr_t dma_addr;
177	struct mlx5_aso *aso;
178	/* Protect ASO WQ access, as it is global to whole IPsec */
179	spinlock_t lock;
180};
181
182struct mlx5e_ipsec_rx_create_attr {
183	struct mlx5_flow_namespace *ns;
184	struct mlx5_ttc_table *ttc;
185	u32 family;
186	int prio;
187	int pol_level;
188	int pol_miss_level;
189	int sa_level;
190	int status_level;
191	enum mlx5_flow_namespace_type chains_ns;
192};
193
194struct mlx5e_ipsec_ft {
195	struct mutex mutex; /* Protect changes to this struct */
196	struct mlx5_flow_table *pol;
197	struct mlx5_flow_table *sa;
198	struct mlx5_flow_table *sa_sel;
199	struct mlx5_flow_table *status;
200	u32 refcnt;
201};
202
203struct mlx5e_ipsec_drop {
204	struct mlx5_flow_handle *rule;
205	struct mlx5_fc *fc;
206};
207
208struct mlx5e_ipsec_rule {
209	struct mlx5_flow_handle *rule;
210	struct mlx5_flow_handle *status_pass;
211	struct mlx5_flow_handle *sa_sel;
212	struct mlx5_modify_hdr *modify_hdr;
213	struct mlx5_pkt_reformat *pkt_reformat;
214	struct mlx5_fc *fc;
215	struct mlx5e_ipsec_drop replay;
216	struct mlx5e_ipsec_drop auth;
217	struct mlx5e_ipsec_drop trailer;
218};
219
220struct mlx5e_ipsec_miss {
221	struct mlx5_flow_group *group;
222	struct mlx5_flow_handle *rule;
223	struct mlx5_fc *fc;
224};
225
226struct mlx5e_ipsec_tx_create_attr {
227	int prio;
228	int pol_level;
229	int sa_level;
230	int cnt_level;
231	enum mlx5_flow_namespace_type chains_ns;
232};
233
234struct mlx5e_ipsec_mpv_work {
235	int event;
236	struct work_struct work;
237	struct mlx5e_priv *slave_priv;
238	struct mlx5e_priv *master_priv;
239};
240
241struct mlx5e_ipsec {
242	struct mlx5_core_dev *mdev;
243	struct xarray sadb;
244	struct mlx5e_ipsec_sw_stats sw_stats;
245	struct mlx5e_ipsec_hw_stats hw_stats;
246	struct workqueue_struct *wq;
247	struct completion comp;
248	struct mlx5e_flow_steering *fs;
249	struct mlx5e_ipsec_rx *rx_ipv4;
250	struct mlx5e_ipsec_rx *rx_ipv6;
251	struct mlx5e_ipsec_rx *rx_esw;
252	struct mlx5e_ipsec_tx *tx;
253	struct mlx5e_ipsec_tx *tx_esw;
254	struct mlx5e_ipsec_aso *aso;
255	struct notifier_block nb;
256	struct notifier_block netevent_nb;
257	struct mlx5_ipsec_fs *roce;
258	u8 is_uplink_rep: 1;
259	struct mlx5e_ipsec_mpv_work mpv_work;
260	struct xarray ipsec_obj_id_map;
261};
262
263struct mlx5e_ipsec_esn_state {
264	u32 esn;
265	u32 esn_msb;
266	u8 overlap: 1;
267};
268
269struct mlx5e_ipsec_limits {
270	u64 round;
271	u8 soft_limit_hit : 1;
272	u8 fix_limit : 1;
273};
274
275struct mlx5e_ipsec_sa_entry {
276	struct mlx5e_ipsec_esn_state esn_state;
277	struct xfrm_state *x;
278	struct net_device *dev;
279	struct mlx5e_ipsec *ipsec;
280	struct mlx5_accel_esp_xfrm_attrs attrs;
281	void (*set_iv_op)(struct sk_buff *skb, struct xfrm_state *x,
282			  struct xfrm_offload *xo);
283	u32 ipsec_obj_id;
284	u32 enc_key_id;
285	struct mlx5e_ipsec_rule ipsec_rule;
286	struct mlx5e_ipsec_work *work;
287	struct mlx5e_ipsec_dwork *dwork;
288	struct mlx5e_ipsec_limits limits;
289	u32 rx_mapped_id;
290	u8 ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
291};
292
293struct mlx5_accel_pol_xfrm_attrs {
294	struct mlx5e_ipsec_addr addrs;
295	struct upspec upspec;
296	u8 action;
297	u8 type : 2;
298	u8 dir : 2;
299	u32 reqid;
300	u32 prio;
301};
302
303struct mlx5e_ipsec_pol_entry {
304	struct xfrm_policy *x;
305	struct mlx5e_ipsec *ipsec;
306	struct mlx5e_ipsec_rule ipsec_rule;
307	struct mlx5_accel_pol_xfrm_attrs attrs;
308};
309
310#ifdef CONFIG_MLX5_EN_IPSEC
311
312void mlx5e_ipsec_init(struct mlx5e_priv *priv);
313void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv);
314void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv);
315
316void mlx5e_accel_ipsec_fs_cleanup(struct mlx5e_ipsec *ipsec);
317int mlx5e_accel_ipsec_fs_init(struct mlx5e_ipsec *ipsec, struct mlx5_devcom_comp_dev **devcom);
318int mlx5e_accel_ipsec_fs_add_rule(struct mlx5e_ipsec_sa_entry *sa_entry);
319void mlx5e_accel_ipsec_fs_del_rule(struct mlx5e_ipsec_sa_entry *sa_entry);
320int mlx5e_accel_ipsec_fs_add_pol(struct mlx5e_ipsec_pol_entry *pol_entry);
321void mlx5e_accel_ipsec_fs_del_pol(struct mlx5e_ipsec_pol_entry *pol_entry);
322void mlx5e_accel_ipsec_fs_modify(struct mlx5e_ipsec_sa_entry *sa_entry);
323bool mlx5e_ipsec_fs_tunnel_allowed(struct mlx5e_ipsec_sa_entry *sa_entry);
324
325int mlx5_ipsec_create_sa_ctx(struct mlx5e_ipsec_sa_entry *sa_entry);
326void mlx5_ipsec_free_sa_ctx(struct mlx5e_ipsec_sa_entry *sa_entry);
327
328u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev);
329
330void mlx5_accel_esp_modify_xfrm(struct mlx5e_ipsec_sa_entry *sa_entry,
331				const struct mlx5_accel_esp_xfrm_attrs *attrs);
332
333int mlx5e_ipsec_aso_init(struct mlx5e_ipsec *ipsec);
334void mlx5e_ipsec_aso_cleanup(struct mlx5e_ipsec *ipsec);
335
336int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry,
337			  struct mlx5_wqe_aso_ctrl_seg *data);
338void mlx5e_accel_ipsec_fs_read_stats(struct mlx5e_priv *priv,
339				     void *ipsec_stats);
340
341void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
342					struct mlx5_accel_esp_xfrm_attrs *attrs);
343void mlx5e_ipsec_handle_mpv_event(int event, struct mlx5e_priv *slave_priv,
344				  struct mlx5e_priv *master_priv);
345void mlx5e_ipsec_send_event(struct mlx5e_priv *priv, int event);
346void mlx5e_ipsec_disable_events(struct mlx5e_priv *priv);
347
348static inline struct mlx5_core_dev *
349mlx5e_ipsec_sa2dev(struct mlx5e_ipsec_sa_entry *sa_entry)
350{
351	return sa_entry->ipsec->mdev;
352}
353
354static inline struct mlx5_core_dev *
355mlx5e_ipsec_pol2dev(struct mlx5e_ipsec_pol_entry *pol_entry)
356{
357	return pol_entry->ipsec->mdev;
358}
359
360static inline bool addr6_all_zero(__be32 *addr6)
361{
362	static const __be32 zaddr6[4] = {};
363
364	return !memcmp(addr6, zaddr6, sizeof(zaddr6));
365}
366#else
367static inline void mlx5e_ipsec_init(struct mlx5e_priv *priv)
368{
369}
370
371static inline void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv)
372{
373}
374
375static inline void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv)
376{
377}
378
379static inline u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev)
380{
381	return 0;
382}
383
384static inline void mlx5e_ipsec_handle_mpv_event(int event, struct mlx5e_priv *slave_priv,
385						struct mlx5e_priv *master_priv)
386{
387}
388
389static inline void mlx5e_ipsec_send_event(struct mlx5e_priv *priv, int event)
390{
391}
392
393static inline void mlx5e_ipsec_disable_events(struct mlx5e_priv *priv)
394{
395}
396#endif
397
398#endif	/* __MLX5E_IPSEC_H__ */
~/ Read-only file preview.