1
2
3
4
5#ifndef _VIRTCHNL_INLINE_IPSEC_H_
6#define _VIRTCHNL_INLINE_IPSEC_H_
7
8#define VIRTCHNL_IPSEC_MAX_CRYPTO_CAP_NUM 3
9#define VIRTCHNL_IPSEC_MAX_ALGO_CAP_NUM 16
10#define VIRTCHNL_IPSEC_MAX_TX_DESC_NUM 128
11#define VIRTCHNL_IPSEC_MAX_CRYPTO_ITEM_NUMBER 2
12#define VIRTCHNL_IPSEC_MAX_KEY_LEN 128
13#define VIRTCHNL_IPSEC_MAX_SA_DESTROY_NUM 8
14#define VIRTCHNL_IPSEC_SA_DESTROY 0
15#define VIRTCHNL_IPSEC_BROADCAST_VFID 0xFFFFFFFF
16#define VIRTCHNL_IPSEC_INVALID_REQ_ID 0xFFFF
17#define VIRTCHNL_IPSEC_INVALID_SA_CFG_RESP 0xFFFFFFFF
18#define VIRTCHNL_IPSEC_INVALID_SP_CFG_RESP 0xFFFFFFFF
19
20
21#define VIRTCHNL_AUTH 1
22#define VIRTCHNL_CIPHER 2
23#define VIRTCHNL_AEAD 3
24
25
26#define VIRTCHNL_IPSEC_ESN_ENA BIT(0)
27#define VIRTCHNL_IPSEC_UDP_ENCAP_ENA BIT(1)
28#define VIRTCHNL_IPSEC_SA_INDEX_SW_ENA BIT(2)
29#define VIRTCHNL_IPSEC_AUDIT_ENA BIT(3)
30#define VIRTCHNL_IPSEC_BYTE_LIMIT_ENA BIT(4)
31#define VIRTCHNL_IPSEC_DROP_ON_AUTH_FAIL_ENA BIT(5)
32#define VIRTCHNL_IPSEC_ARW_CHECK_ENA BIT(6)
33#define VIRTCHNL_IPSEC_24BIT_SPI_ENA BIT(7)
34
35
36
37#define VIRTCHNL_HASH_NO_ALG 0
38#define VIRTCHNL_AES_CBC_MAC 1
39#define VIRTCHNL_AES_CMAC 2
40#define VIRTCHNL_AES_GMAC 3
41#define VIRTCHNL_AES_XCBC_MAC 4
42#define VIRTCHNL_MD5_HMAC 5
43#define VIRTCHNL_SHA1_HMAC 6
44#define VIRTCHNL_SHA224_HMAC 7
45#define VIRTCHNL_SHA256_HMAC 8
46#define VIRTCHNL_SHA384_HMAC 9
47#define VIRTCHNL_SHA512_HMAC 10
48#define VIRTCHNL_SHA3_224_HMAC 11
49#define VIRTCHNL_SHA3_256_HMAC 12
50#define VIRTCHNL_SHA3_384_HMAC 13
51#define VIRTCHNL_SHA3_512_HMAC 14
52
53#define VIRTCHNL_CIPHER_NO_ALG 15
54#define VIRTCHNL_3DES_CBC 16
55#define VIRTCHNL_AES_CBC 17
56#define VIRTCHNL_AES_CTR 18
57
58#define VIRTCHNL_AES_CCM 19
59#define VIRTCHNL_AES_GCM 20
60#define VIRTCHNL_CHACHA20_POLY1305 21
61
62
63#define VIRTCHNL_PROTO_ESP 1
64#define VIRTCHNL_PROTO_AH 2
65#define VIRTCHNL_PROTO_RSVD1 3
66
67
68#define VIRTCHNL_SA_MODE_TRANSPORT 1
69#define VIRTCHNL_SA_MODE_TUNNEL 2
70#define VIRTCHNL_SA_MODE_TRAN_TUN 3
71#define VIRTCHNL_SA_MODE_UNKNOWN 4
72
73
74#define VIRTCHNL_DIR_INGRESS 1
75#define VIRTCHNL_DIR_EGRESS 2
76#define VIRTCHNL_DIR_INGRESS_EGRESS 3
77
78
79#define VIRTCHNL_TERM_SOFTWARE 1
80#define VIRTCHNL_TERM_HARDWARE 2
81
82
83#define VIRTCHNL_IPV4 1
84#define VIRTCHNL_IPV6 2
85
86
87enum inline_ipsec_resp {
88 INLINE_IPSEC_SUCCESS = 0,
89 INLINE_IPSEC_FAIL = -1,
90 INLINE_IPSEC_ERR_FIFO_FULL = -2,
91 INLINE_IPSEC_ERR_NOT_READY = -3,
92 INLINE_IPSEC_ERR_VF_DOWN = -4,
93 INLINE_IPSEC_ERR_INVALID_PARAMS = -5,
94 INLINE_IPSEC_ERR_NO_MEM = -6,
95};
96
97
98enum inline_ipsec_ops {
99 INLINE_IPSEC_OP_GET_CAP = 0,
100 INLINE_IPSEC_OP_GET_STATUS = 1,
101 INLINE_IPSEC_OP_SA_CREATE = 2,
102 INLINE_IPSEC_OP_SA_UPDATE = 3,
103 INLINE_IPSEC_OP_SA_DESTROY = 4,
104 INLINE_IPSEC_OP_SP_CREATE = 5,
105 INLINE_IPSEC_OP_SP_DESTROY = 6,
106 INLINE_IPSEC_OP_SA_READ = 7,
107 INLINE_IPSEC_OP_EVENT = 8,
108 INLINE_IPSEC_OP_RESP = 9,
109};
110
111
112struct virtchnl_algo_cap {
113 u32 algo_type;
114
115 u16 block_size;
116
117 u16 min_key_size;
118 u16 max_key_size;
119 u16 inc_key_size;
120
121 u16 min_iv_size;
122 u16 max_iv_size;
123 u16 inc_iv_size;
124
125 u16 min_digest_size;
126 u16 max_digest_size;
127 u16 inc_digest_size;
128
129 u16 min_aad_size;
130 u16 max_aad_size;
131 u16 inc_aad_size;
132} __rte_packed;
133
134
135struct virtchnl_sym_crypto_cap {
136 u8 crypto_type;
137 u8 algo_cap_num;
138 struct virtchnl_algo_cap algo_cap_list[VIRTCHNL_IPSEC_MAX_ALGO_CAP_NUM];
139} __rte_packed;
140
141
142
143
144
145struct virtchnl_ipsec_cap {
146
147 u16 max_sa_num;
148
149
150 u8 virtchnl_protocol_type;
151
152
153 u8 virtchnl_sa_mode;
154
155
156 u8 virtchnl_direction;
157
158
159 u8 termination_mode;
160
161
162 u8 crypto_cap_num;
163
164
165 u16 desc_id;
166
167
168 u32 caps_enabled;
169
170
171 struct virtchnl_sym_crypto_cap cap[VIRTCHNL_IPSEC_MAX_CRYPTO_CAP_NUM];
172} __rte_packed;
173
174
175struct virtchnl_ipsec_crypto_cfg_item {
176 u8 crypto_type;
177
178 u32 algo_type;
179
180
181 u16 iv_len;
182
183
184 u16 digest_len;
185
186
187 u32 salt;
188
189
190 u16 key_len;
191
192
193 u8 key_data[VIRTCHNL_IPSEC_MAX_KEY_LEN];
194} __rte_packed;
195
196struct virtchnl_ipsec_sym_crypto_cfg {
197 struct virtchnl_ipsec_crypto_cfg_item
198 items[VIRTCHNL_IPSEC_MAX_CRYPTO_ITEM_NUMBER];
199};
200
201
202
203
204
205
206struct virtchnl_ipsec_sa_cfg {
207
208 u8 virtchnl_protocol_type;
209
210
211 u8 virtchnl_termination;
212
213
214 u8 virtchnl_ip_type;
215
216
217 u8 esn_enabled;
218
219
220 u8 udp_encap_enabled;
221
222
223 u8 virtchnl_direction;
224
225
226 u8 reserved1;
227
228
229 u32 spi;
230
231
232 u8 src_addr[16];
233
234
235 u8 dst_addr[16];
236
237
238
239
240 u16 spd_ref;
241
242
243 u32 esn_hi;
244
245
246 u32 esn_low;
247
248
249 u8 sa_index_en;
250
251
252 u32 sa_index;
253
254
255 u8 audit_en;
256
257
258
259
260
261 u8 byte_limit_en;
262
263
264 u64 byte_limit_hard;
265
266
267 u64 byte_limit_soft;
268
269
270 u8 drop_on_auth_fail_en;
271
272
273
274
275 u8 arw_check_en;
276
277
278
279
280
281 u8 arw_size;
282
283
284
285
286 u8 no_ip_offload_en;
287
288
289
290
291 u16 sa_domain;
292
293
294 struct virtchnl_ipsec_sym_crypto_cfg crypto_cfg;
295} __rte_packed;
296
297
298
299
300
301struct virtchnl_ipsec_sa_update {
302 u32 sa_index;
303 u32 esn_hi;
304 u32 esn_low;
305} __rte_packed;
306
307
308
309
310
311
312
313struct virtchnl_ipsec_sa_destroy {
314
315
316
317
318 u8 flag;
319
320
321 u32 sa_index[VIRTCHNL_IPSEC_MAX_SA_DESTROY_NUM];
322} __rte_packed;
323
324
325
326
327
328struct virtchnl_ipsec_sa_read {
329
330 u8 valid;
331
332
333 u8 active;
334
335
336 u8 sn_rollover;
337
338
339 u8 virtchnl_protocol_type;
340
341
342 u8 virtchnl_termination;
343
344
345 u8 audit_en;
346
347
348
349
350
351 u8 byte_limit_en;
352
353
354 u64 byte_limit_hard;
355
356
357 u64 byte_limit_soft;
358
359
360 u8 drop_on_auth_fail_en;
361
362
363
364
365 u8 arw_check_en;
366
367
368
369
370
371 u8 arw_size;
372
373
374 u8 reserved1;
375
376
377 u64 arw_top;
378
379
380 u8 arw[16];
381
382
383 u64 packets_processed;
384
385
386 u64 bytes_processed;
387
388
389 u32 packets_dropped;
390
391
392 u32 auth_fails;
393
394
395 u32 arw_fails;
396
397
398 u8 esn;
399
400
401 u8 virtchnl_direction;
402
403
404 u32 spi;
405
406
407 u32 salt;
408
409
410 u32 esn_hi;
411
412
413 u32 esn_low;
414
415
416
417
418 u16 sa_domain;
419
420
421
422
423 u16 spd_ref;
424
425
426 struct virtchnl_ipsec_sym_crypto_cfg crypto_cfg;
427} __rte_packed;
428
429
430#define VIRTCHNL_IPSEC_INBOUND_SPD_TBL_IPV4 (0)
431#define VIRTCHNL_IPSEC_INBOUND_SPD_TBL_IPV6 (1)
432
433
434struct virtchnl_ipsec_sp_cfg {
435 u32 spi;
436 u32 dip[4];
437
438
439 u8 drop;
440
441
442 u8 cgd;
443
444
445 u8 table_id;
446
447
448 u8 set_tc;
449
450
451 u8 is_udp;
452
453
454 u8 reserved;
455
456
457 u16 udp_port;
458} __rte_packed;
459
460
461
462struct virtchnl_ipsec_sp_destroy {
463
464 u8 table_id;
465 u32 rule_id;
466} __rte_packed;
467
468
469struct virtchnl_ipsec_sp_cfg_resp {
470 u32 rule_id;
471};
472
473struct virtchnl_ipsec_sa_cfg_resp {
474 u32 sa_handle;
475};
476
477#define INLINE_IPSEC_EVENT_RESET 0x1
478#define INLINE_IPSEC_EVENT_CRYPTO_ON 0x2
479#define INLINE_IPSEC_EVENT_CRYPTO_OFF 0x4
480
481struct virtchnl_ipsec_event {
482 u32 ipsec_event_data;
483};
484
485#define INLINE_IPSEC_STATUS_AVAILABLE 0x1
486#define INLINE_IPSEC_STATUS_UNAVAILABLE 0x2
487
488struct virtchnl_ipsec_status {
489 u32 status;
490};
491
492struct virtchnl_ipsec_resp {
493 u32 resp;
494};
495
496
497struct inline_ipsec_msg {
498 u16 ipsec_opcode;
499 u16 req_id;
500
501 union {
502
503 struct virtchnl_ipsec_sa_cfg sa_cfg[0];
504 struct virtchnl_ipsec_sp_cfg sp_cfg[0];
505 struct virtchnl_ipsec_sa_update sa_update[0];
506 struct virtchnl_ipsec_sa_destroy sa_destroy[0];
507 struct virtchnl_ipsec_sp_destroy sp_destroy[0];
508
509
510 struct virtchnl_ipsec_sa_cfg_resp sa_cfg_resp[0];
511 struct virtchnl_ipsec_sp_cfg_resp sp_cfg_resp[0];
512 struct virtchnl_ipsec_cap ipsec_cap[0];
513 struct virtchnl_ipsec_status ipsec_status[0];
514
515 struct virtchnl_ipsec_resp ipsec_resp[0];
516
517
518 struct virtchnl_ipsec_event event[0];
519
520
521 struct virtchnl_ipsec_sa_read sa_read[0];
522 } ipsec_data;
523} __rte_packed;
524
525static inline u16 virtchnl_inline_ipsec_val_msg_len(u16 opcode)
526{
527 u16 valid_len = sizeof(struct inline_ipsec_msg);
528
529 switch (opcode) {
530 case INLINE_IPSEC_OP_GET_CAP:
531 case INLINE_IPSEC_OP_GET_STATUS:
532 break;
533 case INLINE_IPSEC_OP_SA_CREATE:
534 valid_len += sizeof(struct virtchnl_ipsec_sa_cfg);
535 break;
536 case INLINE_IPSEC_OP_SP_CREATE:
537 valid_len += sizeof(struct virtchnl_ipsec_sp_cfg);
538 break;
539 case INLINE_IPSEC_OP_SA_UPDATE:
540 valid_len += sizeof(struct virtchnl_ipsec_sa_update);
541 break;
542 case INLINE_IPSEC_OP_SA_DESTROY:
543 valid_len += sizeof(struct virtchnl_ipsec_sa_destroy);
544 break;
545 case INLINE_IPSEC_OP_SP_DESTROY:
546 valid_len += sizeof(struct virtchnl_ipsec_sp_destroy);
547 break;
548
549
550
551 case INLINE_IPSEC_OP_RESP:
552 valid_len += sizeof(struct virtchnl_ipsec_resp);
553 break;
554 default:
555 valid_len = 0;
556 break;
557 }
558
559 return valid_len;
560}
561
562#endif
563