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