DPDK  21.11.7-rc1
rte_security.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2017,2019-2020 NXP
3  * Copyright(c) 2017-2020 Intel Corporation.
4  */
5 
6 #ifndef _RTE_SECURITY_H_
7 #define _RTE_SECURITY_H_
8 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 #include <sys/types.h>
21 
22 #include <rte_compat.h>
23 #include <rte_common.h>
24 #include <rte_crypto.h>
25 #include <rte_ip.h>
26 #include <rte_mbuf.h>
27 #include <rte_mbuf_dyn.h>
28 #include <rte_memory.h>
29 #include <rte_mempool.h>
30 
37 };
38 
45 };
46 
53 };
54 
60 #define RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR 0x1
61 #define RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR 0x2
62 
73  void *device;
75  const struct rte_security_ops *ops;
77  uint16_t sess_cnt;
79  uint32_t flags;
81 };
82 
83 #define RTE_SEC_CTX_F_FAST_SET_MDATA 0x00000001
84 
86 #define RTE_SEC_CTX_F_FAST_GET_UDATA 0x00000002
87 
101  union {
102  struct {
103  struct in_addr src_ip;
105  struct in_addr dst_ip;
107  uint8_t dscp;
109  uint8_t df;
111  uint8_t ttl;
113  } ipv4;
115  struct {
116  struct in6_addr src_addr;
118  struct in6_addr dst_addr;
120  uint8_t dscp;
122  uint32_t flabel;
124  uint8_t hlimit;
126  } ipv6;
128  };
129 };
130 
131 struct rte_security_ipsec_udp_param {
132  uint16_t sport;
133  uint16_t dport;
134 };
135 
145  uint32_t esn : 1;
146 
153  uint32_t udp_encap : 1;
154 
162  uint32_t copy_dscp : 1;
163 
170  uint32_t copy_flabel : 1;
171 
178  uint32_t copy_df : 1;
179 
187  uint32_t dec_ttl : 1;
188 
196  uint32_t ecn : 1;
197 
204  uint32_t stats : 1;
205 
218  uint32_t iv_gen_disable : 1;
219 
227  uint32_t tunnel_hdr_verify : 2;
228 
234  uint32_t udp_ports_verify : 1;
235 
249  uint32_t ip_csum_enable : 1;
250 
265  uint32_t l4_csum_enable : 1;
266 
274  uint32_t reserved_opts : 18;
275 };
276 
283 };
284 
307 };
308 
315  uint32_t spi;
317  uint32_t salt;
331  uint32_t replay_win_sz;
335  union {
336  uint64_t value;
337  struct {
338  uint32_t low;
339  uint32_t hi;
340  };
341  } esn;
343  struct rte_security_ipsec_udp_param udp;
345 };
346 
352  int dummy;
353 };
354 
362 };
363 
368 };
369 
382 };
383 
390  int8_t bearer;
394  uint8_t en_ordering;
409  uint32_t hfn;
411  uint32_t hfn_threshold;
420  uint8_t hfn_ovrd;
426  uint8_t sdap_enabled;
428  uint16_t reserved;
429 };
430 
441 };
442 
451 };
452 
456 /* Enumeration of rte_security_session_action_type 8<*/
476 };
477 /* >8 End enumeration of rte_security_session_action_type. */
478 
480 /* Enumeration of rte_security_session_protocol 8<*/
490 };
491 /* >8 End enumeration of rte_security_session_protocol. */
492 
496 /* Structure rte_security_session_conf 8< */
503  union {
504  struct rte_security_ipsec_xform ipsec;
505  struct rte_security_macsec_xform macsec;
506  struct rte_security_pdcp_xform pdcp;
507  struct rte_security_docsis_xform docsis;
508  };
512  void *userdata;
514 };
515 /* >8 End of structure rte_security_session_conf. */
516 
517 struct rte_security_session {
518  void *sess_private_data;
520  uint64_t opaque_data;
522 };
523 
535 struct rte_security_session *
537  struct rte_security_session_conf *conf,
538  struct rte_mempool *mp,
539  struct rte_mempool *priv_mp);
540 
551 __rte_experimental
552 int
554  struct rte_security_session *sess,
555  struct rte_security_session_conf *conf);
556 
566 unsigned int
568 
583 int
585  struct rte_security_session *sess);
586 
588 typedef uint64_t rte_security_dynfield_t;
591 
605 __rte_experimental
606 static inline rte_security_dynfield_t *
608 {
609  return RTE_MBUF_DYNFIELD(mbuf,
610  rte_security_dynfield_offset,
611  rte_security_dynfield_t *);
612 }
613 
622 __rte_experimental
623 static inline bool rte_security_dynfield_is_registered(void)
624 {
625  return rte_security_dynfield_offset >= 0;
626 }
627 
629 __rte_experimental
630 extern int __rte_security_set_pkt_metadata(struct rte_security_ctx *instance,
631  struct rte_security_session *sess,
632  struct rte_mbuf *m, void *params);
633 
647 static inline int
649  struct rte_security_session *sess,
650  struct rte_mbuf *mb, void *params)
651 {
652  /* Fast Path */
653  if (instance->flags & RTE_SEC_CTX_F_FAST_SET_MDATA) {
654  *rte_security_dynfield(mb) =
655  (rte_security_dynfield_t)(sess->sess_private_data);
656  return 0;
657  }
658 
659  /* Jump to PMD specific function pointer */
660  return __rte_security_set_pkt_metadata(instance, sess, mb, params);
661 }
662 
664 __rte_experimental
665 extern void *__rte_security_get_userdata(struct rte_security_ctx *instance,
666  uint64_t md);
667 
685 __rte_experimental
686 static inline void *
687 rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md)
688 {
689  /* Fast Path */
690  if (instance->flags & RTE_SEC_CTX_F_FAST_GET_UDATA)
691  return (void *)(uintptr_t)md;
692 
693  /* Jump to PMD specific function pointer */
694  return __rte_security_get_userdata(instance, md);
695 }
696 
703 static inline int
705  struct rte_security_session *sess)
706 {
707  sym_op->sec_session = sess;
708 
709  return 0;
710 }
711 
712 static inline void *
713 get_sec_session_private_data(const struct rte_security_session *sess)
714 {
715  return sess->sess_private_data;
716 }
717 
718 static inline void
719 set_sec_session_private_data(struct rte_security_session *sess,
720  void *private_data)
721 {
722  sess->sess_private_data = private_data;
723 }
724 
734 static inline int
736  struct rte_security_session *sess)
737 {
739  return -EINVAL;
740 
742 
743  return __rte_security_attach_session(op->sym, sess);
744 }
745 
746 struct rte_security_macsec_stats {
747  uint64_t reserved;
748 };
749 
750 struct rte_security_ipsec_stats {
751  uint64_t ipackets;
752  uint64_t opackets;
753  uint64_t ibytes;
754  uint64_t obytes;
755  uint64_t ierrors;
756  uint64_t oerrors;
757  uint64_t reserved1;
758  uint64_t reserved2;
759 };
760 
761 struct rte_security_pdcp_stats {
762  uint64_t reserved;
763 };
764 
765 struct rte_security_docsis_stats {
766  uint64_t reserved;
767 };
768 
769 struct rte_security_stats {
770  enum rte_security_session_protocol protocol;
774  union {
775  struct rte_security_macsec_stats macsec;
776  struct rte_security_ipsec_stats ipsec;
777  struct rte_security_pdcp_stats pdcp;
778  struct rte_security_docsis_stats docsis;
779  };
780 };
781 
795 __rte_experimental
796 int
798  struct rte_security_session *sess,
799  struct rte_security_stats *stats);
800 
810  union {
811  struct {
824  } ipsec;
826  struct {
827  /* To be Filled */
828  int dummy;
829  } macsec;
831  struct {
834  uint32_t capa_flags;
836  } pdcp;
838  struct {
841  } docsis;
843  };
844 
848  uint32_t ol_flags;
850 };
851 
857 #define RTE_SECURITY_PDCP_ORDERING_CAP 0x00000001
858 
863 #define RTE_SECURITY_PDCP_DUP_DETECT_CAP 0x00000002
864 
865 #define RTE_SECURITY_TX_OLOAD_NEED_MDATA 0x00000001
866 
869 #define RTE_SECURITY_TX_HW_TRAILER_OFFLOAD 0x00000002
870 
875 #define RTE_SECURITY_RX_HW_TRAILER_OFFLOAD 0x00010000
876 
888  enum rte_security_session_protocol protocol;
889 
891  union {
892  struct {
894  enum rte_security_ipsec_sa_mode mode;
895  enum rte_security_ipsec_sa_direction direction;
896  } ipsec;
897  struct {
898  enum rte_security_pdcp_domain domain;
899  uint32_t capa_flags;
900  } pdcp;
901  struct {
902  enum rte_security_docsis_direction direction;
903  } docsis;
904  };
905 };
906 
916 const struct rte_security_capability *
918 
930 const struct rte_security_capability *
932  struct rte_security_capability_idx *idx);
933 
934 #ifdef __cplusplus
935 }
936 #endif
937 
938 #endif /* _RTE_SECURITY_H_ */
rte_security_pdcp_sn_size
Definition: rte_security.h:371
rte_security_ipsec_sa_protocol
Definition: rte_security.h:40
__rte_experimental void * __rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md)
static int rte_security_attach_session(struct rte_crypto_op *op, struct rte_security_session *sess)
Definition: rte_security.h:735
struct rte_ether_addr src_addr
Definition: rte_ether.h:284
rte_security_session_action_type
Definition: rte_security.h:457
__rte_experimental int __rte_security_set_pkt_metadata(struct rte_security_ctx *instance, struct rte_security_session *sess, struct rte_mbuf *m, void *params)
rte_security_pdcp_direction
Definition: rte_security.h:365
static int rte_security_set_pkt_metadata(struct rte_security_ctx *instance, struct rte_security_session *sess, struct rte_mbuf *mb, void *params)
Definition: rte_security.h:648
int rte_security_session_destroy(struct rte_security_ctx *instance, struct rte_security_session *sess)
struct rte_security_session * sec_session
const struct rte_security_capability * rte_security_capabilities_get(struct rte_security_ctx *instance)
unsigned int rte_security_session_get_size(struct rte_security_ctx *instance)
uint8_t type
Definition: rte_crypto.h:89
struct rte_crypto_sym_xform * crypto_xform
Definition: rte_security.h:510
static __rte_experimental rte_security_dynfield_t * rte_security_dynfield(struct rte_mbuf *mbuf)
Definition: rte_security.h:607
rte_security_ipsec_sa_mode
Definition: rte_security.h:32
uint16_t sess_cnt
Definition: rte_security.h:77
struct rte_security_session * rte_security_session_create(struct rte_security_ctx *instance, struct rte_security_session_conf *conf, struct rte_mempool *mp, struct rte_mempool *priv_mp)
static int __rte_security_attach_session(struct rte_crypto_sym_op *sym_op, struct rte_security_session *sess)
Definition: rte_security.h:704
int rte_security_dynfield_offset
rte_security_ipsec_sa_direction
Definition: rte_security.h:278
rte_security_ipsec_tunnel_type
Definition: rte_security.h:48
struct rte_ether_addr dst_addr
Definition: rte_ether.h:283
__rte_experimental int rte_security_session_stats_get(struct rte_security_ctx *instance, struct rte_security_session *sess, struct rte_security_stats *stats)
#define RTE_MBUF_DYNFIELD(m, offset, type)
Definition: rte_mbuf_dyn.h:229
#define RTE_SEC_CTX_F_FAST_SET_MDATA
Definition: rte_security.h:83
#define unlikely(x)
__rte_experimental int rte_security_session_update(struct rte_security_ctx *instance, struct rte_security_session *sess, struct rte_security_session_conf *conf)
#define RTE_STD_C11
Definition: rte_common.h:42
static __rte_experimental bool rte_security_dynfield_is_registered(void)
Definition: rte_security.h:623
#define RTE_SEC_CTX_F_FAST_GET_UDATA
Definition: rte_security.h:86
rte_security_docsis_direction
Definition: rte_security.h:432
uint64_t rte_security_dynfield_t
Definition: rte_security.h:588
const struct rte_security_capability * rte_security_capability_get(struct rte_security_ctx *instance, struct rte_security_capability_idx *idx)
const struct rte_cryptodev_capabilities * crypto_capabilities
Definition: rte_security.h:845
uint8_t sess_type
Definition: rte_crypto.h:99
static __rte_experimental void * rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md)
Definition: rte_security.h:687
rte_security_session_protocol
Definition: rte_security.h:481
rte_security_pdcp_domain
Definition: rte_security.h:358
const struct rte_security_ops * ops
Definition: rte_security.h:75
struct rte_crypto_sym_op sym[0]
Definition: rte_crypto.h:135