1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
5 #ifndef _RTE_IPSEC_SA_H_
6 #define _RTE_IPSEC_SA_H_
11 * Defines API to manage IPsec Security Association (SA) objects.
14 #include <rte_common.h>
15 #include <rte_cryptodev.h>
16 #include <rte_security.h>
23 * An opaque structure to represent Security Association (SA).
28 * SA initialization parameters.
30 struct rte_ipsec_sa_prm {
32 uint64_t userdata; /**< provided and interpreted by user */
33 uint64_t flags; /**< see RTE_IPSEC_SAFLAG_* below */
34 /** ipsec configuration */
35 struct rte_security_ipsec_xform ipsec_xform;
36 /** crypto session configuration */
37 struct rte_crypto_sym_xform *crypto_xform;
40 uint8_t hdr_len; /**< tunnel header len */
41 uint8_t hdr_l3_off; /**< offset for IPv4/IPv6 header */
42 uint8_t next_proto; /**< next header protocol */
43 const void *hdr; /**< tunnel header template */
44 } tun; /**< tunnel mode related parameters */
46 uint8_t proto; /**< next header protocol */
47 } trs; /**< transport mode related parameters */
52 * Indicates that SA will(/will not) need an 'atomic' access
53 * to sequence number and replay window.
54 * 'atomic' here means:
56 * - rte_ipsec_pkt_crypto_prepare
57 * - rte_ipsec_pkt_process
58 * can be safely used in MT environment, as long as the user can guarantee
59 * that they obey multiple readers/single writer model for SQN+replay_window
61 * To be more specific:
62 * for outbound SA there are no restrictions.
63 * for inbound SA the caller has to guarantee that at any given moment
64 * only one thread is executing rte_ipsec_pkt_process() for given SA.
65 * Note that it is caller responsibility to maintain correct order
66 * of packets to be processed.
67 * In other words - it is a caller responsibility to serialize process()
70 #define RTE_IPSEC_SAFLAG_SQN_ATOM (1ULL << 0)
73 * SA type is an 64-bit value that contain the following information:
74 * - IP version (IPv4/IPv6)
75 * - IPsec proto (ESP/AH)
77 * - mode (TRANSPORT/TUNNEL)
78 * - for TUNNEL outer IP version (IPv4/IPv6)
79 * - are SA SQN operations 'atomic'
80 * - ESN enabled/disabled
89 RTE_SATP_LOG2_SQN = RTE_SATP_LOG2_MODE + 2,
95 #define RTE_IPSEC_SATP_IPV_MASK (1ULL << RTE_SATP_LOG2_IPV)
96 #define RTE_IPSEC_SATP_IPV4 (0ULL << RTE_SATP_LOG2_IPV)
97 #define RTE_IPSEC_SATP_IPV6 (1ULL << RTE_SATP_LOG2_IPV)
99 #define RTE_IPSEC_SATP_PROTO_MASK (1ULL << RTE_SATP_LOG2_PROTO)
100 #define RTE_IPSEC_SATP_PROTO_AH (0ULL << RTE_SATP_LOG2_PROTO)
101 #define RTE_IPSEC_SATP_PROTO_ESP (1ULL << RTE_SATP_LOG2_PROTO)
103 #define RTE_IPSEC_SATP_DIR_MASK (1ULL << RTE_SATP_LOG2_DIR)
104 #define RTE_IPSEC_SATP_DIR_IB (0ULL << RTE_SATP_LOG2_DIR)
105 #define RTE_IPSEC_SATP_DIR_OB (1ULL << RTE_SATP_LOG2_DIR)
107 #define RTE_IPSEC_SATP_MODE_MASK (3ULL << RTE_SATP_LOG2_MODE)
108 #define RTE_IPSEC_SATP_MODE_TRANS (0ULL << RTE_SATP_LOG2_MODE)
109 #define RTE_IPSEC_SATP_MODE_TUNLV4 (1ULL << RTE_SATP_LOG2_MODE)
110 #define RTE_IPSEC_SATP_MODE_TUNLV6 (2ULL << RTE_SATP_LOG2_MODE)
112 #define RTE_IPSEC_SATP_SQN_MASK (1ULL << RTE_SATP_LOG2_SQN)
113 #define RTE_IPSEC_SATP_SQN_RAW (0ULL << RTE_SATP_LOG2_SQN)
114 #define RTE_IPSEC_SATP_SQN_ATOM (1ULL << RTE_SATP_LOG2_SQN)
116 #define RTE_IPSEC_SATP_ESN_MASK (1ULL << RTE_SATP_LOG2_ESN)
117 #define RTE_IPSEC_SATP_ESN_DISABLE (0ULL << RTE_SATP_LOG2_ESN)
118 #define RTE_IPSEC_SATP_ESN_ENABLE (1ULL << RTE_SATP_LOG2_ESN)
120 #define RTE_IPSEC_SATP_ECN_MASK (1ULL << RTE_SATP_LOG2_ECN)
121 #define RTE_IPSEC_SATP_ECN_DISABLE (0ULL << RTE_SATP_LOG2_ECN)
122 #define RTE_IPSEC_SATP_ECN_ENABLE (1ULL << RTE_SATP_LOG2_ECN)
124 #define RTE_IPSEC_SATP_DSCP_MASK (1ULL << RTE_SATP_LOG2_DSCP)
125 #define RTE_IPSEC_SATP_DSCP_DISABLE (0ULL << RTE_SATP_LOG2_DSCP)
126 #define RTE_IPSEC_SATP_DSCP_ENABLE (1ULL << RTE_SATP_LOG2_DSCP)
129 * get type of given SA
134 rte_ipsec_sa_type(const struct rte_ipsec_sa *sa);
137 * Calculate required SA size based on provided input parameters.
139 * Parameters that will be used to initialise SA object.
141 * - Actual size required for SA with given parameters.
142 * - -EINVAL if the parameters are invalid.
145 rte_ipsec_sa_size(const struct rte_ipsec_sa_prm *prm);
148 * initialise SA based on provided input parameters.
150 * SA object to initialise.
152 * Parameters used to initialise given SA object.
154 * size of the provided buffer for SA.
156 * - Actual size of SA object if operation completed successfully.
157 * - -EINVAL if the parameters are invalid.
158 * - -ENOSPC if the size of the provided buffer is not big enough.
161 rte_ipsec_sa_init(struct rte_ipsec_sa *sa, const struct rte_ipsec_sa_prm *prm,
167 * Pointer to SA object to de-initialize.
170 rte_ipsec_sa_fini(struct rte_ipsec_sa *sa);
176 #endif /* _RTE_IPSEC_SA_H_ */