1*2bfe3f2eSlogwang /*-
2*2bfe3f2eSlogwang  *   BSD LICENSE
3*2bfe3f2eSlogwang  *
4*2bfe3f2eSlogwang  *   Copyright 2017 NXP.
5*2bfe3f2eSlogwang  *   Copyright(c) 2017 Intel Corporation. All rights reserved.
6*2bfe3f2eSlogwang  *
7*2bfe3f2eSlogwang  *   Redistribution and use in source and binary forms, with or without
8*2bfe3f2eSlogwang  *   modification, are permitted provided that the following conditions
9*2bfe3f2eSlogwang  *   are met:
10*2bfe3f2eSlogwang  *
11*2bfe3f2eSlogwang  *     * Redistributions of source code must retain the above copyright
12*2bfe3f2eSlogwang  *       notice, this list of conditions and the following disclaimer.
13*2bfe3f2eSlogwang  *     * Redistributions in binary form must reproduce the above copyright
14*2bfe3f2eSlogwang  *       notice, this list of conditions and the following disclaimer in
15*2bfe3f2eSlogwang  *       the documentation and/or other materials provided with the
16*2bfe3f2eSlogwang  *       distribution.
17*2bfe3f2eSlogwang  *     * Neither the name of NXP nor the names of its
18*2bfe3f2eSlogwang  *       contributors may be used to endorse or promote products derived
19*2bfe3f2eSlogwang  *       from this software without specific prior written permission.
20*2bfe3f2eSlogwang  *
21*2bfe3f2eSlogwang  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22*2bfe3f2eSlogwang  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23*2bfe3f2eSlogwang  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24*2bfe3f2eSlogwang  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25*2bfe3f2eSlogwang  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26*2bfe3f2eSlogwang  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27*2bfe3f2eSlogwang  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28*2bfe3f2eSlogwang  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29*2bfe3f2eSlogwang  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30*2bfe3f2eSlogwang  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31*2bfe3f2eSlogwang  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*2bfe3f2eSlogwang  */
33*2bfe3f2eSlogwang 
34*2bfe3f2eSlogwang #ifndef _RTE_SECURITY_H_
35*2bfe3f2eSlogwang #define _RTE_SECURITY_H_
36*2bfe3f2eSlogwang 
37*2bfe3f2eSlogwang /**
38*2bfe3f2eSlogwang  * @file rte_security.h
39*2bfe3f2eSlogwang  * @b EXPERIMENTAL: this API may change without prior notice
40*2bfe3f2eSlogwang  *
41*2bfe3f2eSlogwang  * RTE Security Common Definitions
42*2bfe3f2eSlogwang  *
43*2bfe3f2eSlogwang  */
44*2bfe3f2eSlogwang 
45*2bfe3f2eSlogwang #ifdef __cplusplus
46*2bfe3f2eSlogwang extern "C" {
47*2bfe3f2eSlogwang #endif
48*2bfe3f2eSlogwang 
49*2bfe3f2eSlogwang #include <sys/types.h>
50*2bfe3f2eSlogwang 
51*2bfe3f2eSlogwang #include <netinet/in.h>
52*2bfe3f2eSlogwang #include <netinet/ip.h>
53*2bfe3f2eSlogwang #include <netinet/ip6.h>
54*2bfe3f2eSlogwang 
55*2bfe3f2eSlogwang #include <rte_common.h>
56*2bfe3f2eSlogwang #include <rte_crypto.h>
57*2bfe3f2eSlogwang #include <rte_mbuf.h>
58*2bfe3f2eSlogwang #include <rte_memory.h>
59*2bfe3f2eSlogwang #include <rte_mempool.h>
60*2bfe3f2eSlogwang 
61*2bfe3f2eSlogwang /** IPSec protocol mode */
62*2bfe3f2eSlogwang enum rte_security_ipsec_sa_mode {
63*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_MODE_TRANSPORT = 1,
64*2bfe3f2eSlogwang 	/**< IPSec Transport mode */
65*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
66*2bfe3f2eSlogwang 	/**< IPSec Tunnel mode */
67*2bfe3f2eSlogwang };
68*2bfe3f2eSlogwang 
69*2bfe3f2eSlogwang /** IPSec Protocol */
70*2bfe3f2eSlogwang enum rte_security_ipsec_sa_protocol {
71*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_PROTO_AH = 1,
72*2bfe3f2eSlogwang 	/**< AH protocol */
73*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_PROTO_ESP,
74*2bfe3f2eSlogwang 	/**< ESP protocol */
75*2bfe3f2eSlogwang };
76*2bfe3f2eSlogwang 
77*2bfe3f2eSlogwang /** IPSEC tunnel type */
78*2bfe3f2eSlogwang enum rte_security_ipsec_tunnel_type {
79*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_TUNNEL_IPV4 = 1,
80*2bfe3f2eSlogwang 	/**< Outer header is IPv4 */
81*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_TUNNEL_IPV6,
82*2bfe3f2eSlogwang 	/**< Outer header is IPv6 */
83*2bfe3f2eSlogwang };
84*2bfe3f2eSlogwang 
85*2bfe3f2eSlogwang /**
86*2bfe3f2eSlogwang  * Security context for crypto/eth devices
87*2bfe3f2eSlogwang  *
88*2bfe3f2eSlogwang  * Security instance for each driver to register security operations.
89*2bfe3f2eSlogwang  * The application can get the security context from the crypto/eth device id
90*2bfe3f2eSlogwang  * using the APIs rte_cryptodev_get_sec_ctx()/rte_eth_dev_get_sec_ctx()
91*2bfe3f2eSlogwang  * This structure is used to identify the device(crypto/eth) for which the
92*2bfe3f2eSlogwang  * security operations need to be performed.
93*2bfe3f2eSlogwang  */
94*2bfe3f2eSlogwang struct rte_security_ctx {
95*2bfe3f2eSlogwang 	void *device;
96*2bfe3f2eSlogwang 	/**< Crypto/ethernet device attached */
97*2bfe3f2eSlogwang 	const struct rte_security_ops *ops;
98*2bfe3f2eSlogwang 	/**< Pointer to security ops for the device */
99*2bfe3f2eSlogwang 	uint16_t sess_cnt;
100*2bfe3f2eSlogwang 	/**< Number of sessions attached to this context */
101*2bfe3f2eSlogwang };
102*2bfe3f2eSlogwang 
103*2bfe3f2eSlogwang /**
104*2bfe3f2eSlogwang  * IPSEC tunnel parameters
105*2bfe3f2eSlogwang  *
106*2bfe3f2eSlogwang  * These parameters are used to build outbound tunnel headers.
107*2bfe3f2eSlogwang  */
108*2bfe3f2eSlogwang struct rte_security_ipsec_tunnel_param {
109*2bfe3f2eSlogwang 	enum rte_security_ipsec_tunnel_type type;
110*2bfe3f2eSlogwang 	/**< Tunnel type: IPv4 or IPv6 */
111*2bfe3f2eSlogwang 	RTE_STD_C11
112*2bfe3f2eSlogwang 	union {
113*2bfe3f2eSlogwang 		struct {
114*2bfe3f2eSlogwang 			struct in_addr src_ip;
115*2bfe3f2eSlogwang 			/**< IPv4 source address */
116*2bfe3f2eSlogwang 			struct in_addr dst_ip;
117*2bfe3f2eSlogwang 			/**< IPv4 destination address */
118*2bfe3f2eSlogwang 			uint8_t dscp;
119*2bfe3f2eSlogwang 			/**< IPv4 Differentiated Services Code Point */
120*2bfe3f2eSlogwang 			uint8_t df;
121*2bfe3f2eSlogwang 			/**< IPv4 Don't Fragment bit */
122*2bfe3f2eSlogwang 			uint8_t ttl;
123*2bfe3f2eSlogwang 			/**< IPv4 Time To Live */
124*2bfe3f2eSlogwang 		} ipv4;
125*2bfe3f2eSlogwang 		/**< IPv4 header parameters */
126*2bfe3f2eSlogwang 		struct {
127*2bfe3f2eSlogwang 			struct in6_addr src_addr;
128*2bfe3f2eSlogwang 			/**< IPv6 source address */
129*2bfe3f2eSlogwang 			struct in6_addr dst_addr;
130*2bfe3f2eSlogwang 			/**< IPv6 destination address */
131*2bfe3f2eSlogwang 			uint8_t dscp;
132*2bfe3f2eSlogwang 			/**< IPv6 Differentiated Services Code Point */
133*2bfe3f2eSlogwang 			uint32_t flabel;
134*2bfe3f2eSlogwang 			/**< IPv6 flow label */
135*2bfe3f2eSlogwang 			uint8_t hlimit;
136*2bfe3f2eSlogwang 			/**< IPv6 hop limit */
137*2bfe3f2eSlogwang 		} ipv6;
138*2bfe3f2eSlogwang 		/**< IPv6 header parameters */
139*2bfe3f2eSlogwang 	};
140*2bfe3f2eSlogwang };
141*2bfe3f2eSlogwang 
142*2bfe3f2eSlogwang /**
143*2bfe3f2eSlogwang  * IPsec Security Association option flags
144*2bfe3f2eSlogwang  */
145*2bfe3f2eSlogwang struct rte_security_ipsec_sa_options {
146*2bfe3f2eSlogwang 	/**< Extended Sequence Numbers (ESN)
147*2bfe3f2eSlogwang 	 *
148*2bfe3f2eSlogwang 	 * * 1: Use extended (64 bit) sequence numbers
149*2bfe3f2eSlogwang 	 * * 0: Use normal sequence numbers
150*2bfe3f2eSlogwang 	 */
151*2bfe3f2eSlogwang 	uint32_t esn : 1;
152*2bfe3f2eSlogwang 
153*2bfe3f2eSlogwang 	/**< UDP encapsulation
154*2bfe3f2eSlogwang 	 *
155*2bfe3f2eSlogwang 	 * * 1: Do UDP encapsulation/decapsulation so that IPSEC packets can
156*2bfe3f2eSlogwang 	 *      traverse through NAT boxes.
157*2bfe3f2eSlogwang 	 * * 0: No UDP encapsulation
158*2bfe3f2eSlogwang 	 */
159*2bfe3f2eSlogwang 	uint32_t udp_encap : 1;
160*2bfe3f2eSlogwang 
161*2bfe3f2eSlogwang 	/**< Copy DSCP bits
162*2bfe3f2eSlogwang 	 *
163*2bfe3f2eSlogwang 	 * * 1: Copy IPv4 or IPv6 DSCP bits from inner IP header to
164*2bfe3f2eSlogwang 	 *      the outer IP header in encapsulation, and vice versa in
165*2bfe3f2eSlogwang 	 *      decapsulation.
166*2bfe3f2eSlogwang 	 * * 0: Do not change DSCP field.
167*2bfe3f2eSlogwang 	 */
168*2bfe3f2eSlogwang 	uint32_t copy_dscp : 1;
169*2bfe3f2eSlogwang 
170*2bfe3f2eSlogwang 	/**< Copy IPv6 Flow Label
171*2bfe3f2eSlogwang 	 *
172*2bfe3f2eSlogwang 	 * * 1: Copy IPv6 flow label from inner IPv6 header to the
173*2bfe3f2eSlogwang 	 *      outer IPv6 header.
174*2bfe3f2eSlogwang 	 * * 0: Outer header is not modified.
175*2bfe3f2eSlogwang 	 */
176*2bfe3f2eSlogwang 	uint32_t copy_flabel : 1;
177*2bfe3f2eSlogwang 
178*2bfe3f2eSlogwang 	/**< Copy IPv4 Don't Fragment bit
179*2bfe3f2eSlogwang 	 *
180*2bfe3f2eSlogwang 	 * * 1: Copy the DF bit from the inner IPv4 header to the outer
181*2bfe3f2eSlogwang 	 *      IPv4 header.
182*2bfe3f2eSlogwang 	 * * 0: Outer header is not modified.
183*2bfe3f2eSlogwang 	 */
184*2bfe3f2eSlogwang 	uint32_t copy_df : 1;
185*2bfe3f2eSlogwang 
186*2bfe3f2eSlogwang 	/**< Decrement inner packet Time To Live (TTL) field
187*2bfe3f2eSlogwang 	 *
188*2bfe3f2eSlogwang 	 * * 1: In tunnel mode, decrement inner packet IPv4 TTL or
189*2bfe3f2eSlogwang 	 *      IPv6 Hop Limit after tunnel decapsulation, or before tunnel
190*2bfe3f2eSlogwang 	 *      encapsulation.
191*2bfe3f2eSlogwang 	 * * 0: Inner packet is not modified.
192*2bfe3f2eSlogwang 	 */
193*2bfe3f2eSlogwang 	uint32_t dec_ttl : 1;
194*2bfe3f2eSlogwang };
195*2bfe3f2eSlogwang 
196*2bfe3f2eSlogwang /** IPSec security association direction */
197*2bfe3f2eSlogwang enum rte_security_ipsec_sa_direction {
198*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
199*2bfe3f2eSlogwang 	/**< Encrypt and generate digest */
200*2bfe3f2eSlogwang 	RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
201*2bfe3f2eSlogwang 	/**< Verify digest and decrypt */
202*2bfe3f2eSlogwang };
203*2bfe3f2eSlogwang 
204*2bfe3f2eSlogwang /**
205*2bfe3f2eSlogwang  * IPsec security association configuration data.
206*2bfe3f2eSlogwang  *
207*2bfe3f2eSlogwang  * This structure contains data required to create an IPsec SA security session.
208*2bfe3f2eSlogwang  */
209*2bfe3f2eSlogwang struct rte_security_ipsec_xform {
210*2bfe3f2eSlogwang 	uint32_t spi;
211*2bfe3f2eSlogwang 	/**< SA security parameter index */
212*2bfe3f2eSlogwang 	uint32_t salt;
213*2bfe3f2eSlogwang 	/**< SA salt */
214*2bfe3f2eSlogwang 	struct rte_security_ipsec_sa_options options;
215*2bfe3f2eSlogwang 	/**< various SA options */
216*2bfe3f2eSlogwang 	enum rte_security_ipsec_sa_direction direction;
217*2bfe3f2eSlogwang 	/**< IPSec SA Direction - Egress/Ingress */
218*2bfe3f2eSlogwang 	enum rte_security_ipsec_sa_protocol proto;
219*2bfe3f2eSlogwang 	/**< IPsec SA Protocol - AH/ESP */
220*2bfe3f2eSlogwang 	enum rte_security_ipsec_sa_mode mode;
221*2bfe3f2eSlogwang 	/**< IPsec SA Mode - transport/tunnel */
222*2bfe3f2eSlogwang 	struct rte_security_ipsec_tunnel_param tunnel;
223*2bfe3f2eSlogwang 	/**< Tunnel parameters, NULL for transport mode */
224*2bfe3f2eSlogwang };
225*2bfe3f2eSlogwang 
226*2bfe3f2eSlogwang /**
227*2bfe3f2eSlogwang  * MACsec security session configuration
228*2bfe3f2eSlogwang  */
229*2bfe3f2eSlogwang struct rte_security_macsec_xform {
230*2bfe3f2eSlogwang 	/** To be Filled */
231*2bfe3f2eSlogwang 	int dummy;
232*2bfe3f2eSlogwang };
233*2bfe3f2eSlogwang 
234*2bfe3f2eSlogwang /**
235*2bfe3f2eSlogwang  * Security session action type.
236*2bfe3f2eSlogwang  */
237*2bfe3f2eSlogwang enum rte_security_session_action_type {
238*2bfe3f2eSlogwang 	RTE_SECURITY_ACTION_TYPE_NONE,
239*2bfe3f2eSlogwang 	/**< No security actions */
240*2bfe3f2eSlogwang 	RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
241*2bfe3f2eSlogwang 	/**< Crypto processing for security protocol is processed inline
242*2bfe3f2eSlogwang 	 * during transmission
243*2bfe3f2eSlogwang 	 */
244*2bfe3f2eSlogwang 	RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
245*2bfe3f2eSlogwang 	/**< All security protocol processing is performed inline during
246*2bfe3f2eSlogwang 	 * transmission
247*2bfe3f2eSlogwang 	 */
248*2bfe3f2eSlogwang 	RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL
249*2bfe3f2eSlogwang 	/**< All security protocol processing including crypto is performed
250*2bfe3f2eSlogwang 	 * on a lookaside accelerator
251*2bfe3f2eSlogwang 	 */
252*2bfe3f2eSlogwang };
253*2bfe3f2eSlogwang 
254*2bfe3f2eSlogwang /** Security session protocol definition */
255*2bfe3f2eSlogwang enum rte_security_session_protocol {
256*2bfe3f2eSlogwang 	RTE_SECURITY_PROTOCOL_IPSEC = 1,
257*2bfe3f2eSlogwang 	/**< IPsec Protocol */
258*2bfe3f2eSlogwang 	RTE_SECURITY_PROTOCOL_MACSEC,
259*2bfe3f2eSlogwang 	/**< MACSec Protocol */
260*2bfe3f2eSlogwang };
261*2bfe3f2eSlogwang 
262*2bfe3f2eSlogwang /**
263*2bfe3f2eSlogwang  * Security session configuration
264*2bfe3f2eSlogwang  */
265*2bfe3f2eSlogwang struct rte_security_session_conf {
266*2bfe3f2eSlogwang 	enum rte_security_session_action_type action_type;
267*2bfe3f2eSlogwang 	/**< Type of action to be performed on the session */
268*2bfe3f2eSlogwang 	enum rte_security_session_protocol protocol;
269*2bfe3f2eSlogwang 	/**< Security protocol to be configured */
270*2bfe3f2eSlogwang 	RTE_STD_C11
271*2bfe3f2eSlogwang 	union {
272*2bfe3f2eSlogwang 		struct rte_security_ipsec_xform ipsec;
273*2bfe3f2eSlogwang 		struct rte_security_macsec_xform macsec;
274*2bfe3f2eSlogwang 	};
275*2bfe3f2eSlogwang 	/**< Configuration parameters for security session */
276*2bfe3f2eSlogwang 	struct rte_crypto_sym_xform *crypto_xform;
277*2bfe3f2eSlogwang 	/**< Security Session Crypto Transformations */
278*2bfe3f2eSlogwang };
279*2bfe3f2eSlogwang 
280*2bfe3f2eSlogwang struct rte_security_session {
281*2bfe3f2eSlogwang 	void *sess_private_data;
282*2bfe3f2eSlogwang 	/**< Private session material */
283*2bfe3f2eSlogwang };
284*2bfe3f2eSlogwang 
285*2bfe3f2eSlogwang /**
286*2bfe3f2eSlogwang  * Create security session as specified by the session configuration
287*2bfe3f2eSlogwang  *
288*2bfe3f2eSlogwang  * @param   instance	security instance
289*2bfe3f2eSlogwang  * @param   conf	session configuration parameters
290*2bfe3f2eSlogwang  * @param   mp		mempool to allocate session objects from
291*2bfe3f2eSlogwang  * @return
292*2bfe3f2eSlogwang  *  - On success, pointer to session
293*2bfe3f2eSlogwang  *  - On failure, NULL
294*2bfe3f2eSlogwang  */
295*2bfe3f2eSlogwang struct rte_security_session *
296*2bfe3f2eSlogwang rte_security_session_create(struct rte_security_ctx *instance,
297*2bfe3f2eSlogwang 			    struct rte_security_session_conf *conf,
298*2bfe3f2eSlogwang 			    struct rte_mempool *mp);
299*2bfe3f2eSlogwang 
300*2bfe3f2eSlogwang /**
301*2bfe3f2eSlogwang  * Update security session as specified by the session configuration
302*2bfe3f2eSlogwang  *
303*2bfe3f2eSlogwang  * @param   instance	security instance
304*2bfe3f2eSlogwang  * @param   sess	session to update parameters
305*2bfe3f2eSlogwang  * @param   conf	update configuration parameters
306*2bfe3f2eSlogwang  * @return
307*2bfe3f2eSlogwang  *  - On success returns 0
308*2bfe3f2eSlogwang  *  - On failure return errno
309*2bfe3f2eSlogwang  */
310*2bfe3f2eSlogwang int
311*2bfe3f2eSlogwang rte_security_session_update(struct rte_security_ctx *instance,
312*2bfe3f2eSlogwang 			    struct rte_security_session *sess,
313*2bfe3f2eSlogwang 			    struct rte_security_session_conf *conf);
314*2bfe3f2eSlogwang 
315*2bfe3f2eSlogwang /**
316*2bfe3f2eSlogwang  * Free security session header and the session private data and
317*2bfe3f2eSlogwang  * return it to its original mempool.
318*2bfe3f2eSlogwang  *
319*2bfe3f2eSlogwang  * @param   instance	security instance
320*2bfe3f2eSlogwang  * @param   sess	security session to freed
321*2bfe3f2eSlogwang  *
322*2bfe3f2eSlogwang  * @return
323*2bfe3f2eSlogwang  *  - 0 if successful.
324*2bfe3f2eSlogwang  *  - -EINVAL if session is NULL.
325*2bfe3f2eSlogwang  *  - -EBUSY if not all device private data has been freed.
326*2bfe3f2eSlogwang  */
327*2bfe3f2eSlogwang int
328*2bfe3f2eSlogwang rte_security_session_destroy(struct rte_security_ctx *instance,
329*2bfe3f2eSlogwang 			     struct rte_security_session *sess);
330*2bfe3f2eSlogwang 
331*2bfe3f2eSlogwang /**
332*2bfe3f2eSlogwang  *  Updates the buffer with device-specific defined metadata
333*2bfe3f2eSlogwang  *
334*2bfe3f2eSlogwang  * @param	instance	security instance
335*2bfe3f2eSlogwang  * @param	sess		security session
336*2bfe3f2eSlogwang  * @param	mb		packet mbuf to set metadata on.
337*2bfe3f2eSlogwang  * @param	params		device-specific defined parameters
338*2bfe3f2eSlogwang  *				required for metadata
339*2bfe3f2eSlogwang  *
340*2bfe3f2eSlogwang  * @return
341*2bfe3f2eSlogwang  *  - On success, zero.
342*2bfe3f2eSlogwang  *  - On failure, a negative value.
343*2bfe3f2eSlogwang  */
344*2bfe3f2eSlogwang int
345*2bfe3f2eSlogwang rte_security_set_pkt_metadata(struct rte_security_ctx *instance,
346*2bfe3f2eSlogwang 			      struct rte_security_session *sess,
347*2bfe3f2eSlogwang 			      struct rte_mbuf *mb, void *params);
348*2bfe3f2eSlogwang 
349*2bfe3f2eSlogwang /**
350*2bfe3f2eSlogwang  * Attach a session to a symmetric crypto operation
351*2bfe3f2eSlogwang  *
352*2bfe3f2eSlogwang  * @param	sym_op	crypto operation
353*2bfe3f2eSlogwang  * @param	sess	security session
354*2bfe3f2eSlogwang  */
355*2bfe3f2eSlogwang static inline int
356*2bfe3f2eSlogwang __rte_security_attach_session(struct rte_crypto_sym_op *sym_op,
357*2bfe3f2eSlogwang 			      struct rte_security_session *sess)
358*2bfe3f2eSlogwang {
359*2bfe3f2eSlogwang 	sym_op->sec_session = sess;
360*2bfe3f2eSlogwang 
361*2bfe3f2eSlogwang 	return 0;
362*2bfe3f2eSlogwang }
363*2bfe3f2eSlogwang 
364*2bfe3f2eSlogwang static inline void *
365*2bfe3f2eSlogwang get_sec_session_private_data(const struct rte_security_session *sess)
366*2bfe3f2eSlogwang {
367*2bfe3f2eSlogwang 	return sess->sess_private_data;
368*2bfe3f2eSlogwang }
369*2bfe3f2eSlogwang 
370*2bfe3f2eSlogwang static inline void
371*2bfe3f2eSlogwang set_sec_session_private_data(struct rte_security_session *sess,
372*2bfe3f2eSlogwang 			     void *private_data)
373*2bfe3f2eSlogwang {
374*2bfe3f2eSlogwang 	sess->sess_private_data = private_data;
375*2bfe3f2eSlogwang }
376*2bfe3f2eSlogwang 
377*2bfe3f2eSlogwang /**
378*2bfe3f2eSlogwang  * Attach a session to a crypto operation.
379*2bfe3f2eSlogwang  * This API is needed only in case of RTE_SECURITY_SESS_CRYPTO_PROTO_OFFLOAD
380*2bfe3f2eSlogwang  * For other rte_security_session_action_type, ol_flags in rte_mbuf may be
381*2bfe3f2eSlogwang  * defined to perform security operations.
382*2bfe3f2eSlogwang  *
383*2bfe3f2eSlogwang  * @param	op	crypto operation
384*2bfe3f2eSlogwang  * @param	sess	security session
385*2bfe3f2eSlogwang  */
386*2bfe3f2eSlogwang static inline int
387*2bfe3f2eSlogwang rte_security_attach_session(struct rte_crypto_op *op,
388*2bfe3f2eSlogwang 			    struct rte_security_session *sess)
389*2bfe3f2eSlogwang {
390*2bfe3f2eSlogwang 	if (unlikely(op->type != RTE_CRYPTO_OP_TYPE_SYMMETRIC))
391*2bfe3f2eSlogwang 		return -EINVAL;
392*2bfe3f2eSlogwang 
393*2bfe3f2eSlogwang 	op->sess_type =  RTE_CRYPTO_OP_SECURITY_SESSION;
394*2bfe3f2eSlogwang 
395*2bfe3f2eSlogwang 	return __rte_security_attach_session(op->sym, sess);
396*2bfe3f2eSlogwang }
397*2bfe3f2eSlogwang 
398*2bfe3f2eSlogwang struct rte_security_macsec_stats {
399*2bfe3f2eSlogwang 	uint64_t reserved;
400*2bfe3f2eSlogwang };
401*2bfe3f2eSlogwang 
402*2bfe3f2eSlogwang struct rte_security_ipsec_stats {
403*2bfe3f2eSlogwang 	uint64_t reserved;
404*2bfe3f2eSlogwang 
405*2bfe3f2eSlogwang };
406*2bfe3f2eSlogwang 
407*2bfe3f2eSlogwang struct rte_security_stats {
408*2bfe3f2eSlogwang 	enum rte_security_session_protocol protocol;
409*2bfe3f2eSlogwang 	/**< Security protocol to be configured */
410*2bfe3f2eSlogwang 
411*2bfe3f2eSlogwang 	RTE_STD_C11
412*2bfe3f2eSlogwang 	union {
413*2bfe3f2eSlogwang 		struct rte_security_macsec_stats macsec;
414*2bfe3f2eSlogwang 		struct rte_security_ipsec_stats ipsec;
415*2bfe3f2eSlogwang 	};
416*2bfe3f2eSlogwang };
417*2bfe3f2eSlogwang 
418*2bfe3f2eSlogwang /**
419*2bfe3f2eSlogwang  * Get security session statistics
420*2bfe3f2eSlogwang  *
421*2bfe3f2eSlogwang  * @param	instance	security instance
422*2bfe3f2eSlogwang  * @param	sess		security session
423*2bfe3f2eSlogwang  * @param	stats		statistics
424*2bfe3f2eSlogwang  * @return
425*2bfe3f2eSlogwang  *  - On success return 0
426*2bfe3f2eSlogwang  *  - On failure errno
427*2bfe3f2eSlogwang  */
428*2bfe3f2eSlogwang int
429*2bfe3f2eSlogwang rte_security_session_stats_get(struct rte_security_ctx *instance,
430*2bfe3f2eSlogwang 			       struct rte_security_session *sess,
431*2bfe3f2eSlogwang 			       struct rte_security_stats *stats);
432*2bfe3f2eSlogwang 
433*2bfe3f2eSlogwang /**
434*2bfe3f2eSlogwang  * Security capability definition
435*2bfe3f2eSlogwang  */
436*2bfe3f2eSlogwang struct rte_security_capability {
437*2bfe3f2eSlogwang 	enum rte_security_session_action_type action;
438*2bfe3f2eSlogwang 	/**< Security action type*/
439*2bfe3f2eSlogwang 	enum rte_security_session_protocol protocol;
440*2bfe3f2eSlogwang 	/**< Security protocol */
441*2bfe3f2eSlogwang 	RTE_STD_C11
442*2bfe3f2eSlogwang 	union {
443*2bfe3f2eSlogwang 		struct {
444*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_protocol proto;
445*2bfe3f2eSlogwang 			/**< IPsec SA protocol */
446*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_mode mode;
447*2bfe3f2eSlogwang 			/**< IPsec SA mode */
448*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_direction direction;
449*2bfe3f2eSlogwang 			/**< IPsec SA direction */
450*2bfe3f2eSlogwang 			struct rte_security_ipsec_sa_options options;
451*2bfe3f2eSlogwang 			/**< IPsec SA supported options */
452*2bfe3f2eSlogwang 		} ipsec;
453*2bfe3f2eSlogwang 		/**< IPsec capability */
454*2bfe3f2eSlogwang 		struct {
455*2bfe3f2eSlogwang 			/* To be Filled */
456*2bfe3f2eSlogwang 			int dummy;
457*2bfe3f2eSlogwang 		} macsec;
458*2bfe3f2eSlogwang 		/**< MACsec capability */
459*2bfe3f2eSlogwang 	};
460*2bfe3f2eSlogwang 
461*2bfe3f2eSlogwang 	const struct rte_cryptodev_capabilities *crypto_capabilities;
462*2bfe3f2eSlogwang 	/**< Corresponding crypto capabilities for security capability  */
463*2bfe3f2eSlogwang 
464*2bfe3f2eSlogwang 	uint32_t ol_flags;
465*2bfe3f2eSlogwang 	/**< Device offload flags */
466*2bfe3f2eSlogwang };
467*2bfe3f2eSlogwang 
468*2bfe3f2eSlogwang #define RTE_SECURITY_TX_OLOAD_NEED_MDATA	0x00000001
469*2bfe3f2eSlogwang /**< HW needs metadata update, see rte_security_set_pkt_metadata().
470*2bfe3f2eSlogwang  */
471*2bfe3f2eSlogwang 
472*2bfe3f2eSlogwang #define RTE_SECURITY_TX_HW_TRAILER_OFFLOAD	0x00000002
473*2bfe3f2eSlogwang /**< HW constructs trailer of packets
474*2bfe3f2eSlogwang  * Transmitted packets will have the trailer added to them
475*2bfe3f2eSlogwang  * by hardawre. The next protocol field will be based on
476*2bfe3f2eSlogwang  * the mbuf->inner_esp_next_proto field.
477*2bfe3f2eSlogwang  */
478*2bfe3f2eSlogwang #define RTE_SECURITY_RX_HW_TRAILER_OFFLOAD	0x00010000
479*2bfe3f2eSlogwang /**< HW removes trailer of packets
480*2bfe3f2eSlogwang  * Received packets have no trailer, the next protocol field
481*2bfe3f2eSlogwang  * is supplied in the mbuf->inner_esp_next_proto field.
482*2bfe3f2eSlogwang  * Inner packet is not modified.
483*2bfe3f2eSlogwang  */
484*2bfe3f2eSlogwang 
485*2bfe3f2eSlogwang /**
486*2bfe3f2eSlogwang  * Security capability index used to query a security instance for a specific
487*2bfe3f2eSlogwang  * security capability
488*2bfe3f2eSlogwang  */
489*2bfe3f2eSlogwang struct rte_security_capability_idx {
490*2bfe3f2eSlogwang 	enum rte_security_session_action_type action;
491*2bfe3f2eSlogwang 	enum rte_security_session_protocol protocol;
492*2bfe3f2eSlogwang 
493*2bfe3f2eSlogwang 	RTE_STD_C11
494*2bfe3f2eSlogwang 	union {
495*2bfe3f2eSlogwang 		struct {
496*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_protocol proto;
497*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_mode mode;
498*2bfe3f2eSlogwang 			enum rte_security_ipsec_sa_direction direction;
499*2bfe3f2eSlogwang 		} ipsec;
500*2bfe3f2eSlogwang 	};
501*2bfe3f2eSlogwang };
502*2bfe3f2eSlogwang 
503*2bfe3f2eSlogwang /**
504*2bfe3f2eSlogwang  *  Returns array of security instance capabilities
505*2bfe3f2eSlogwang  *
506*2bfe3f2eSlogwang  * @param	instance	Security instance.
507*2bfe3f2eSlogwang  *
508*2bfe3f2eSlogwang  * @return
509*2bfe3f2eSlogwang  *   - Returns array of security capabilities.
510*2bfe3f2eSlogwang  *   - Return NULL if no capabilities available.
511*2bfe3f2eSlogwang  */
512*2bfe3f2eSlogwang const struct rte_security_capability *
513*2bfe3f2eSlogwang rte_security_capabilities_get(struct rte_security_ctx *instance);
514*2bfe3f2eSlogwang 
515*2bfe3f2eSlogwang /**
516*2bfe3f2eSlogwang  * Query if a specific capability is available on security instance
517*2bfe3f2eSlogwang  *
518*2bfe3f2eSlogwang  * @param	instance	security instance.
519*2bfe3f2eSlogwang  * @param	idx		security capability index to match against
520*2bfe3f2eSlogwang  *
521*2bfe3f2eSlogwang  * @return
522*2bfe3f2eSlogwang  *   - Returns pointer to security capability on match of capability
523*2bfe3f2eSlogwang  *     index criteria.
524*2bfe3f2eSlogwang  *   - Return NULL if the capability not matched on security instance.
525*2bfe3f2eSlogwang  */
526*2bfe3f2eSlogwang const struct rte_security_capability *
527*2bfe3f2eSlogwang rte_security_capability_get(struct rte_security_ctx *instance,
528*2bfe3f2eSlogwang 			    struct rte_security_capability_idx *idx);
529*2bfe3f2eSlogwang 
530*2bfe3f2eSlogwang #ifdef __cplusplus
531*2bfe3f2eSlogwang }
532*2bfe3f2eSlogwang #endif
533*2bfe3f2eSlogwang 
534*2bfe3f2eSlogwang #endif /* _RTE_SECURITY_H_ */
535