1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 22bfe3f2eSlogwang * Copyright 2017 NXP. 3*d30ea906Sjfb8856606 * Copyright(c) 2017 Intel Corporation. 42bfe3f2eSlogwang */ 52bfe3f2eSlogwang 62bfe3f2eSlogwang #ifndef _RTE_SECURITY_H_ 72bfe3f2eSlogwang #define _RTE_SECURITY_H_ 82bfe3f2eSlogwang 92bfe3f2eSlogwang /** 102bfe3f2eSlogwang * @file rte_security.h 112bfe3f2eSlogwang * 122bfe3f2eSlogwang * RTE Security Common Definitions 132bfe3f2eSlogwang * 142bfe3f2eSlogwang */ 152bfe3f2eSlogwang 162bfe3f2eSlogwang #ifdef __cplusplus 172bfe3f2eSlogwang extern "C" { 182bfe3f2eSlogwang #endif 192bfe3f2eSlogwang 202bfe3f2eSlogwang #include <sys/types.h> 212bfe3f2eSlogwang 222bfe3f2eSlogwang #include <netinet/in.h> 232bfe3f2eSlogwang #include <netinet/ip.h> 242bfe3f2eSlogwang #include <netinet/ip6.h> 252bfe3f2eSlogwang 26*d30ea906Sjfb8856606 #include <rte_compat.h> 272bfe3f2eSlogwang #include <rte_common.h> 282bfe3f2eSlogwang #include <rte_crypto.h> 292bfe3f2eSlogwang #include <rte_mbuf.h> 302bfe3f2eSlogwang #include <rte_memory.h> 312bfe3f2eSlogwang #include <rte_mempool.h> 322bfe3f2eSlogwang 332bfe3f2eSlogwang /** IPSec protocol mode */ 342bfe3f2eSlogwang enum rte_security_ipsec_sa_mode { 352bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_MODE_TRANSPORT = 1, 362bfe3f2eSlogwang /**< IPSec Transport mode */ 372bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, 382bfe3f2eSlogwang /**< IPSec Tunnel mode */ 392bfe3f2eSlogwang }; 402bfe3f2eSlogwang 412bfe3f2eSlogwang /** IPSec Protocol */ 422bfe3f2eSlogwang enum rte_security_ipsec_sa_protocol { 432bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_PROTO_AH = 1, 442bfe3f2eSlogwang /**< AH protocol */ 452bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_PROTO_ESP, 462bfe3f2eSlogwang /**< ESP protocol */ 472bfe3f2eSlogwang }; 482bfe3f2eSlogwang 492bfe3f2eSlogwang /** IPSEC tunnel type */ 502bfe3f2eSlogwang enum rte_security_ipsec_tunnel_type { 512bfe3f2eSlogwang RTE_SECURITY_IPSEC_TUNNEL_IPV4 = 1, 522bfe3f2eSlogwang /**< Outer header is IPv4 */ 532bfe3f2eSlogwang RTE_SECURITY_IPSEC_TUNNEL_IPV6, 542bfe3f2eSlogwang /**< Outer header is IPv6 */ 552bfe3f2eSlogwang }; 562bfe3f2eSlogwang 572bfe3f2eSlogwang /** 582bfe3f2eSlogwang * Security context for crypto/eth devices 592bfe3f2eSlogwang * 602bfe3f2eSlogwang * Security instance for each driver to register security operations. 612bfe3f2eSlogwang * The application can get the security context from the crypto/eth device id 622bfe3f2eSlogwang * using the APIs rte_cryptodev_get_sec_ctx()/rte_eth_dev_get_sec_ctx() 632bfe3f2eSlogwang * This structure is used to identify the device(crypto/eth) for which the 642bfe3f2eSlogwang * security operations need to be performed. 652bfe3f2eSlogwang */ 662bfe3f2eSlogwang struct rte_security_ctx { 672bfe3f2eSlogwang void *device; 682bfe3f2eSlogwang /**< Crypto/ethernet device attached */ 692bfe3f2eSlogwang const struct rte_security_ops *ops; 702bfe3f2eSlogwang /**< Pointer to security ops for the device */ 712bfe3f2eSlogwang uint16_t sess_cnt; 722bfe3f2eSlogwang /**< Number of sessions attached to this context */ 732bfe3f2eSlogwang }; 742bfe3f2eSlogwang 752bfe3f2eSlogwang /** 762bfe3f2eSlogwang * IPSEC tunnel parameters 772bfe3f2eSlogwang * 782bfe3f2eSlogwang * These parameters are used to build outbound tunnel headers. 792bfe3f2eSlogwang */ 802bfe3f2eSlogwang struct rte_security_ipsec_tunnel_param { 812bfe3f2eSlogwang enum rte_security_ipsec_tunnel_type type; 822bfe3f2eSlogwang /**< Tunnel type: IPv4 or IPv6 */ 832bfe3f2eSlogwang RTE_STD_C11 842bfe3f2eSlogwang union { 852bfe3f2eSlogwang struct { 862bfe3f2eSlogwang struct in_addr src_ip; 872bfe3f2eSlogwang /**< IPv4 source address */ 882bfe3f2eSlogwang struct in_addr dst_ip; 892bfe3f2eSlogwang /**< IPv4 destination address */ 902bfe3f2eSlogwang uint8_t dscp; 912bfe3f2eSlogwang /**< IPv4 Differentiated Services Code Point */ 922bfe3f2eSlogwang uint8_t df; 932bfe3f2eSlogwang /**< IPv4 Don't Fragment bit */ 942bfe3f2eSlogwang uint8_t ttl; 952bfe3f2eSlogwang /**< IPv4 Time To Live */ 962bfe3f2eSlogwang } ipv4; 972bfe3f2eSlogwang /**< IPv4 header parameters */ 982bfe3f2eSlogwang struct { 992bfe3f2eSlogwang struct in6_addr src_addr; 1002bfe3f2eSlogwang /**< IPv6 source address */ 1012bfe3f2eSlogwang struct in6_addr dst_addr; 1022bfe3f2eSlogwang /**< IPv6 destination address */ 1032bfe3f2eSlogwang uint8_t dscp; 1042bfe3f2eSlogwang /**< IPv6 Differentiated Services Code Point */ 1052bfe3f2eSlogwang uint32_t flabel; 1062bfe3f2eSlogwang /**< IPv6 flow label */ 1072bfe3f2eSlogwang uint8_t hlimit; 1082bfe3f2eSlogwang /**< IPv6 hop limit */ 1092bfe3f2eSlogwang } ipv6; 1102bfe3f2eSlogwang /**< IPv6 header parameters */ 1112bfe3f2eSlogwang }; 1122bfe3f2eSlogwang }; 1132bfe3f2eSlogwang 1142bfe3f2eSlogwang /** 1152bfe3f2eSlogwang * IPsec Security Association option flags 1162bfe3f2eSlogwang */ 1172bfe3f2eSlogwang struct rte_security_ipsec_sa_options { 1182bfe3f2eSlogwang /**< Extended Sequence Numbers (ESN) 1192bfe3f2eSlogwang * 1202bfe3f2eSlogwang * * 1: Use extended (64 bit) sequence numbers 1212bfe3f2eSlogwang * * 0: Use normal sequence numbers 1222bfe3f2eSlogwang */ 1232bfe3f2eSlogwang uint32_t esn : 1; 1242bfe3f2eSlogwang 1252bfe3f2eSlogwang /**< UDP encapsulation 1262bfe3f2eSlogwang * 1272bfe3f2eSlogwang * * 1: Do UDP encapsulation/decapsulation so that IPSEC packets can 1282bfe3f2eSlogwang * traverse through NAT boxes. 1292bfe3f2eSlogwang * * 0: No UDP encapsulation 1302bfe3f2eSlogwang */ 1312bfe3f2eSlogwang uint32_t udp_encap : 1; 1322bfe3f2eSlogwang 1332bfe3f2eSlogwang /**< Copy DSCP bits 1342bfe3f2eSlogwang * 1352bfe3f2eSlogwang * * 1: Copy IPv4 or IPv6 DSCP bits from inner IP header to 1362bfe3f2eSlogwang * the outer IP header in encapsulation, and vice versa in 1372bfe3f2eSlogwang * decapsulation. 1382bfe3f2eSlogwang * * 0: Do not change DSCP field. 1392bfe3f2eSlogwang */ 1402bfe3f2eSlogwang uint32_t copy_dscp : 1; 1412bfe3f2eSlogwang 1422bfe3f2eSlogwang /**< Copy IPv6 Flow Label 1432bfe3f2eSlogwang * 1442bfe3f2eSlogwang * * 1: Copy IPv6 flow label from inner IPv6 header to the 1452bfe3f2eSlogwang * outer IPv6 header. 1462bfe3f2eSlogwang * * 0: Outer header is not modified. 1472bfe3f2eSlogwang */ 1482bfe3f2eSlogwang uint32_t copy_flabel : 1; 1492bfe3f2eSlogwang 1502bfe3f2eSlogwang /**< Copy IPv4 Don't Fragment bit 1512bfe3f2eSlogwang * 1522bfe3f2eSlogwang * * 1: Copy the DF bit from the inner IPv4 header to the outer 1532bfe3f2eSlogwang * IPv4 header. 1542bfe3f2eSlogwang * * 0: Outer header is not modified. 1552bfe3f2eSlogwang */ 1562bfe3f2eSlogwang uint32_t copy_df : 1; 1572bfe3f2eSlogwang 1582bfe3f2eSlogwang /**< Decrement inner packet Time To Live (TTL) field 1592bfe3f2eSlogwang * 1602bfe3f2eSlogwang * * 1: In tunnel mode, decrement inner packet IPv4 TTL or 1612bfe3f2eSlogwang * IPv6 Hop Limit after tunnel decapsulation, or before tunnel 1622bfe3f2eSlogwang * encapsulation. 1632bfe3f2eSlogwang * * 0: Inner packet is not modified. 1642bfe3f2eSlogwang */ 1652bfe3f2eSlogwang uint32_t dec_ttl : 1; 1662bfe3f2eSlogwang }; 1672bfe3f2eSlogwang 1682bfe3f2eSlogwang /** IPSec security association direction */ 1692bfe3f2eSlogwang enum rte_security_ipsec_sa_direction { 1702bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_DIR_EGRESS, 1712bfe3f2eSlogwang /**< Encrypt and generate digest */ 1722bfe3f2eSlogwang RTE_SECURITY_IPSEC_SA_DIR_INGRESS, 1732bfe3f2eSlogwang /**< Verify digest and decrypt */ 1742bfe3f2eSlogwang }; 1752bfe3f2eSlogwang 1762bfe3f2eSlogwang /** 1772bfe3f2eSlogwang * IPsec security association configuration data. 1782bfe3f2eSlogwang * 1792bfe3f2eSlogwang * This structure contains data required to create an IPsec SA security session. 1802bfe3f2eSlogwang */ 1812bfe3f2eSlogwang struct rte_security_ipsec_xform { 1822bfe3f2eSlogwang uint32_t spi; 1832bfe3f2eSlogwang /**< SA security parameter index */ 1842bfe3f2eSlogwang uint32_t salt; 1852bfe3f2eSlogwang /**< SA salt */ 1862bfe3f2eSlogwang struct rte_security_ipsec_sa_options options; 1872bfe3f2eSlogwang /**< various SA options */ 1882bfe3f2eSlogwang enum rte_security_ipsec_sa_direction direction; 1892bfe3f2eSlogwang /**< IPSec SA Direction - Egress/Ingress */ 1902bfe3f2eSlogwang enum rte_security_ipsec_sa_protocol proto; 1912bfe3f2eSlogwang /**< IPsec SA Protocol - AH/ESP */ 1922bfe3f2eSlogwang enum rte_security_ipsec_sa_mode mode; 1932bfe3f2eSlogwang /**< IPsec SA Mode - transport/tunnel */ 1942bfe3f2eSlogwang struct rte_security_ipsec_tunnel_param tunnel; 1952bfe3f2eSlogwang /**< Tunnel parameters, NULL for transport mode */ 196*d30ea906Sjfb8856606 uint64_t esn_soft_limit; 197*d30ea906Sjfb8856606 /**< ESN for which the overflow event need to be raised */ 1982bfe3f2eSlogwang }; 1992bfe3f2eSlogwang 2002bfe3f2eSlogwang /** 2012bfe3f2eSlogwang * MACsec security session configuration 2022bfe3f2eSlogwang */ 2032bfe3f2eSlogwang struct rte_security_macsec_xform { 2042bfe3f2eSlogwang /** To be Filled */ 2052bfe3f2eSlogwang int dummy; 2062bfe3f2eSlogwang }; 2072bfe3f2eSlogwang 2082bfe3f2eSlogwang /** 209*d30ea906Sjfb8856606 * PDCP Mode of session 210*d30ea906Sjfb8856606 */ 211*d30ea906Sjfb8856606 enum rte_security_pdcp_domain { 212*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_MODE_CONTROL, /**< PDCP control plane */ 213*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_MODE_DATA, /**< PDCP data plane */ 214*d30ea906Sjfb8856606 }; 215*d30ea906Sjfb8856606 216*d30ea906Sjfb8856606 /** PDCP Frame direction */ 217*d30ea906Sjfb8856606 enum rte_security_pdcp_direction { 218*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_UPLINK, /**< Uplink */ 219*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_DOWNLINK, /**< Downlink */ 220*d30ea906Sjfb8856606 }; 221*d30ea906Sjfb8856606 222*d30ea906Sjfb8856606 /** PDCP Sequence Number Size selectors */ 223*d30ea906Sjfb8856606 enum rte_security_pdcp_sn_size { 224*d30ea906Sjfb8856606 /** PDCP_SN_SIZE_5: 5bit sequence number */ 225*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_SN_SIZE_5 = 5, 226*d30ea906Sjfb8856606 /** PDCP_SN_SIZE_7: 7bit sequence number */ 227*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_SN_SIZE_7 = 7, 228*d30ea906Sjfb8856606 /** PDCP_SN_SIZE_12: 12bit sequence number */ 229*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_SN_SIZE_12 = 12, 230*d30ea906Sjfb8856606 /** PDCP_SN_SIZE_15: 15bit sequence number */ 231*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_SN_SIZE_15 = 15, 232*d30ea906Sjfb8856606 /** PDCP_SN_SIZE_18: 18bit sequence number */ 233*d30ea906Sjfb8856606 RTE_SECURITY_PDCP_SN_SIZE_18 = 18 234*d30ea906Sjfb8856606 }; 235*d30ea906Sjfb8856606 236*d30ea906Sjfb8856606 /** 237*d30ea906Sjfb8856606 * PDCP security association configuration data. 238*d30ea906Sjfb8856606 * 239*d30ea906Sjfb8856606 * This structure contains data required to create a PDCP security session. 240*d30ea906Sjfb8856606 */ 241*d30ea906Sjfb8856606 struct rte_security_pdcp_xform { 242*d30ea906Sjfb8856606 int8_t bearer; /**< PDCP bearer ID */ 243*d30ea906Sjfb8856606 /** Enable in order delivery, this field shall be set only if 244*d30ea906Sjfb8856606 * driver/HW is capable. See RTE_SECURITY_PDCP_ORDERING_CAP. 245*d30ea906Sjfb8856606 */ 246*d30ea906Sjfb8856606 uint8_t en_ordering; 247*d30ea906Sjfb8856606 /** Notify driver/HW to detect and remove duplicate packets. 248*d30ea906Sjfb8856606 * This field should be set only when driver/hw is capable. 249*d30ea906Sjfb8856606 * See RTE_SECURITY_PDCP_DUP_DETECT_CAP. 250*d30ea906Sjfb8856606 */ 251*d30ea906Sjfb8856606 uint8_t remove_duplicates; 252*d30ea906Sjfb8856606 /** PDCP mode of operation: Control or data */ 253*d30ea906Sjfb8856606 enum rte_security_pdcp_domain domain; 254*d30ea906Sjfb8856606 /** PDCP Frame Direction 0:UL 1:DL */ 255*d30ea906Sjfb8856606 enum rte_security_pdcp_direction pkt_dir; 256*d30ea906Sjfb8856606 /** Sequence number size, 5/7/12/15/18 */ 257*d30ea906Sjfb8856606 enum rte_security_pdcp_sn_size sn_size; 258*d30ea906Sjfb8856606 /** Starting Hyper Frame Number to be used together with the SN 259*d30ea906Sjfb8856606 * from the PDCP frames 260*d30ea906Sjfb8856606 */ 261*d30ea906Sjfb8856606 uint32_t hfn; 262*d30ea906Sjfb8856606 /** HFN Threshold for key renegotiation */ 263*d30ea906Sjfb8856606 uint32_t hfn_threshold; 264*d30ea906Sjfb8856606 }; 265*d30ea906Sjfb8856606 266*d30ea906Sjfb8856606 /** 2672bfe3f2eSlogwang * Security session action type. 2682bfe3f2eSlogwang */ 2692bfe3f2eSlogwang enum rte_security_session_action_type { 2702bfe3f2eSlogwang RTE_SECURITY_ACTION_TYPE_NONE, 2712bfe3f2eSlogwang /**< No security actions */ 2722bfe3f2eSlogwang RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO, 2732bfe3f2eSlogwang /**< Crypto processing for security protocol is processed inline 2742bfe3f2eSlogwang * during transmission 2752bfe3f2eSlogwang */ 2762bfe3f2eSlogwang RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL, 2772bfe3f2eSlogwang /**< All security protocol processing is performed inline during 2782bfe3f2eSlogwang * transmission 2792bfe3f2eSlogwang */ 2802bfe3f2eSlogwang RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL 2812bfe3f2eSlogwang /**< All security protocol processing including crypto is performed 2822bfe3f2eSlogwang * on a lookaside accelerator 2832bfe3f2eSlogwang */ 2842bfe3f2eSlogwang }; 2852bfe3f2eSlogwang 2862bfe3f2eSlogwang /** Security session protocol definition */ 2872bfe3f2eSlogwang enum rte_security_session_protocol { 2882bfe3f2eSlogwang RTE_SECURITY_PROTOCOL_IPSEC = 1, 2892bfe3f2eSlogwang /**< IPsec Protocol */ 2902bfe3f2eSlogwang RTE_SECURITY_PROTOCOL_MACSEC, 2912bfe3f2eSlogwang /**< MACSec Protocol */ 292*d30ea906Sjfb8856606 RTE_SECURITY_PROTOCOL_PDCP, 293*d30ea906Sjfb8856606 /**< PDCP Protocol */ 2942bfe3f2eSlogwang }; 2952bfe3f2eSlogwang 2962bfe3f2eSlogwang /** 2972bfe3f2eSlogwang * Security session configuration 2982bfe3f2eSlogwang */ 2992bfe3f2eSlogwang struct rte_security_session_conf { 3002bfe3f2eSlogwang enum rte_security_session_action_type action_type; 3012bfe3f2eSlogwang /**< Type of action to be performed on the session */ 3022bfe3f2eSlogwang enum rte_security_session_protocol protocol; 3032bfe3f2eSlogwang /**< Security protocol to be configured */ 3042bfe3f2eSlogwang RTE_STD_C11 3052bfe3f2eSlogwang union { 3062bfe3f2eSlogwang struct rte_security_ipsec_xform ipsec; 3072bfe3f2eSlogwang struct rte_security_macsec_xform macsec; 308*d30ea906Sjfb8856606 struct rte_security_pdcp_xform pdcp; 3092bfe3f2eSlogwang }; 3102bfe3f2eSlogwang /**< Configuration parameters for security session */ 3112bfe3f2eSlogwang struct rte_crypto_sym_xform *crypto_xform; 3122bfe3f2eSlogwang /**< Security Session Crypto Transformations */ 313*d30ea906Sjfb8856606 void *userdata; 314*d30ea906Sjfb8856606 /**< Application specific userdata to be saved with session */ 3152bfe3f2eSlogwang }; 3162bfe3f2eSlogwang 3172bfe3f2eSlogwang struct rte_security_session { 3182bfe3f2eSlogwang void *sess_private_data; 3192bfe3f2eSlogwang /**< Private session material */ 3202bfe3f2eSlogwang }; 3212bfe3f2eSlogwang 3222bfe3f2eSlogwang /** 3232bfe3f2eSlogwang * Create security session as specified by the session configuration 3242bfe3f2eSlogwang * 3252bfe3f2eSlogwang * @param instance security instance 3262bfe3f2eSlogwang * @param conf session configuration parameters 3272bfe3f2eSlogwang * @param mp mempool to allocate session objects from 3282bfe3f2eSlogwang * @return 3292bfe3f2eSlogwang * - On success, pointer to session 3302bfe3f2eSlogwang * - On failure, NULL 3312bfe3f2eSlogwang */ 3322bfe3f2eSlogwang struct rte_security_session * 3332bfe3f2eSlogwang rte_security_session_create(struct rte_security_ctx *instance, 3342bfe3f2eSlogwang struct rte_security_session_conf *conf, 3352bfe3f2eSlogwang struct rte_mempool *mp); 3362bfe3f2eSlogwang 3372bfe3f2eSlogwang /** 3382bfe3f2eSlogwang * Update security session as specified by the session configuration 3392bfe3f2eSlogwang * 3402bfe3f2eSlogwang * @param instance security instance 3412bfe3f2eSlogwang * @param sess session to update parameters 3422bfe3f2eSlogwang * @param conf update configuration parameters 3432bfe3f2eSlogwang * @return 3442bfe3f2eSlogwang * - On success returns 0 3452bfe3f2eSlogwang * - On failure return errno 3462bfe3f2eSlogwang */ 347*d30ea906Sjfb8856606 int __rte_experimental 3482bfe3f2eSlogwang rte_security_session_update(struct rte_security_ctx *instance, 3492bfe3f2eSlogwang struct rte_security_session *sess, 3502bfe3f2eSlogwang struct rte_security_session_conf *conf); 3512bfe3f2eSlogwang 3522bfe3f2eSlogwang /** 353*d30ea906Sjfb8856606 * Get the size of the security session data for a device. 354*d30ea906Sjfb8856606 * 355*d30ea906Sjfb8856606 * @param instance security instance. 356*d30ea906Sjfb8856606 * 357*d30ea906Sjfb8856606 * @return 358*d30ea906Sjfb8856606 * - Size of the private data, if successful 359*d30ea906Sjfb8856606 * - 0 if device is invalid or does not support the operation. 360*d30ea906Sjfb8856606 */ 361*d30ea906Sjfb8856606 unsigned int 362*d30ea906Sjfb8856606 rte_security_session_get_size(struct rte_security_ctx *instance); 363*d30ea906Sjfb8856606 364*d30ea906Sjfb8856606 /** 3652bfe3f2eSlogwang * Free security session header and the session private data and 3662bfe3f2eSlogwang * return it to its original mempool. 3672bfe3f2eSlogwang * 3682bfe3f2eSlogwang * @param instance security instance 3692bfe3f2eSlogwang * @param sess security session to freed 3702bfe3f2eSlogwang * 3712bfe3f2eSlogwang * @return 3722bfe3f2eSlogwang * - 0 if successful. 3732bfe3f2eSlogwang * - -EINVAL if session is NULL. 3742bfe3f2eSlogwang * - -EBUSY if not all device private data has been freed. 3752bfe3f2eSlogwang */ 3762bfe3f2eSlogwang int 3772bfe3f2eSlogwang rte_security_session_destroy(struct rte_security_ctx *instance, 3782bfe3f2eSlogwang struct rte_security_session *sess); 3792bfe3f2eSlogwang 3802bfe3f2eSlogwang /** 3812bfe3f2eSlogwang * Updates the buffer with device-specific defined metadata 3822bfe3f2eSlogwang * 3832bfe3f2eSlogwang * @param instance security instance 3842bfe3f2eSlogwang * @param sess security session 3852bfe3f2eSlogwang * @param mb packet mbuf to set metadata on. 3862bfe3f2eSlogwang * @param params device-specific defined parameters 3872bfe3f2eSlogwang * required for metadata 3882bfe3f2eSlogwang * 3892bfe3f2eSlogwang * @return 3902bfe3f2eSlogwang * - On success, zero. 3912bfe3f2eSlogwang * - On failure, a negative value. 3922bfe3f2eSlogwang */ 3932bfe3f2eSlogwang int 3942bfe3f2eSlogwang rte_security_set_pkt_metadata(struct rte_security_ctx *instance, 3952bfe3f2eSlogwang struct rte_security_session *sess, 3962bfe3f2eSlogwang struct rte_mbuf *mb, void *params); 3972bfe3f2eSlogwang 3982bfe3f2eSlogwang /** 399*d30ea906Sjfb8856606 * Get userdata associated with the security session. Device specific metadata 400*d30ea906Sjfb8856606 * provided would be used to uniquely identify the security session being 401*d30ea906Sjfb8856606 * referred to. This userdata would be registered while creating the session, 402*d30ea906Sjfb8856606 * and application can use this to identify the SA etc. 403*d30ea906Sjfb8856606 * 404*d30ea906Sjfb8856606 * Device specific metadata would be set in mbuf for inline processed inbound 405*d30ea906Sjfb8856606 * packets. In addition, the same metadata would be set for IPsec events 406*d30ea906Sjfb8856606 * reported by rte_eth_event framework. 407*d30ea906Sjfb8856606 * 408*d30ea906Sjfb8856606 * @param instance security instance 409*d30ea906Sjfb8856606 * @param md device-specific metadata 410*d30ea906Sjfb8856606 * 411*d30ea906Sjfb8856606 * @return 412*d30ea906Sjfb8856606 * - On success, userdata 413*d30ea906Sjfb8856606 * - On failure, NULL 414*d30ea906Sjfb8856606 */ 415*d30ea906Sjfb8856606 void * __rte_experimental 416*d30ea906Sjfb8856606 rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md); 417*d30ea906Sjfb8856606 418*d30ea906Sjfb8856606 /** 4192bfe3f2eSlogwang * Attach a session to a symmetric crypto operation 4202bfe3f2eSlogwang * 4212bfe3f2eSlogwang * @param sym_op crypto operation 4222bfe3f2eSlogwang * @param sess security session 4232bfe3f2eSlogwang */ 4242bfe3f2eSlogwang static inline int 4252bfe3f2eSlogwang __rte_security_attach_session(struct rte_crypto_sym_op *sym_op, 4262bfe3f2eSlogwang struct rte_security_session *sess) 4272bfe3f2eSlogwang { 4282bfe3f2eSlogwang sym_op->sec_session = sess; 4292bfe3f2eSlogwang 4302bfe3f2eSlogwang return 0; 4312bfe3f2eSlogwang } 4322bfe3f2eSlogwang 4332bfe3f2eSlogwang static inline void * 4342bfe3f2eSlogwang get_sec_session_private_data(const struct rte_security_session *sess) 4352bfe3f2eSlogwang { 4362bfe3f2eSlogwang return sess->sess_private_data; 4372bfe3f2eSlogwang } 4382bfe3f2eSlogwang 4392bfe3f2eSlogwang static inline void 4402bfe3f2eSlogwang set_sec_session_private_data(struct rte_security_session *sess, 4412bfe3f2eSlogwang void *private_data) 4422bfe3f2eSlogwang { 4432bfe3f2eSlogwang sess->sess_private_data = private_data; 4442bfe3f2eSlogwang } 4452bfe3f2eSlogwang 4462bfe3f2eSlogwang /** 4472bfe3f2eSlogwang * Attach a session to a crypto operation. 4482bfe3f2eSlogwang * This API is needed only in case of RTE_SECURITY_SESS_CRYPTO_PROTO_OFFLOAD 4492bfe3f2eSlogwang * For other rte_security_session_action_type, ol_flags in rte_mbuf may be 4502bfe3f2eSlogwang * defined to perform security operations. 4512bfe3f2eSlogwang * 4522bfe3f2eSlogwang * @param op crypto operation 4532bfe3f2eSlogwang * @param sess security session 4542bfe3f2eSlogwang */ 4552bfe3f2eSlogwang static inline int 4562bfe3f2eSlogwang rte_security_attach_session(struct rte_crypto_op *op, 4572bfe3f2eSlogwang struct rte_security_session *sess) 4582bfe3f2eSlogwang { 4592bfe3f2eSlogwang if (unlikely(op->type != RTE_CRYPTO_OP_TYPE_SYMMETRIC)) 4602bfe3f2eSlogwang return -EINVAL; 4612bfe3f2eSlogwang 4622bfe3f2eSlogwang op->sess_type = RTE_CRYPTO_OP_SECURITY_SESSION; 4632bfe3f2eSlogwang 4642bfe3f2eSlogwang return __rte_security_attach_session(op->sym, sess); 4652bfe3f2eSlogwang } 4662bfe3f2eSlogwang 4672bfe3f2eSlogwang struct rte_security_macsec_stats { 4682bfe3f2eSlogwang uint64_t reserved; 4692bfe3f2eSlogwang }; 4702bfe3f2eSlogwang 4712bfe3f2eSlogwang struct rte_security_ipsec_stats { 4722bfe3f2eSlogwang uint64_t reserved; 4732bfe3f2eSlogwang 4742bfe3f2eSlogwang }; 4752bfe3f2eSlogwang 476*d30ea906Sjfb8856606 struct rte_security_pdcp_stats { 477*d30ea906Sjfb8856606 uint64_t reserved; 478*d30ea906Sjfb8856606 }; 479*d30ea906Sjfb8856606 4802bfe3f2eSlogwang struct rte_security_stats { 4812bfe3f2eSlogwang enum rte_security_session_protocol protocol; 4822bfe3f2eSlogwang /**< Security protocol to be configured */ 4832bfe3f2eSlogwang 4842bfe3f2eSlogwang RTE_STD_C11 4852bfe3f2eSlogwang union { 4862bfe3f2eSlogwang struct rte_security_macsec_stats macsec; 4872bfe3f2eSlogwang struct rte_security_ipsec_stats ipsec; 488*d30ea906Sjfb8856606 struct rte_security_pdcp_stats pdcp; 4892bfe3f2eSlogwang }; 4902bfe3f2eSlogwang }; 4912bfe3f2eSlogwang 4922bfe3f2eSlogwang /** 4932bfe3f2eSlogwang * Get security session statistics 4942bfe3f2eSlogwang * 4952bfe3f2eSlogwang * @param instance security instance 4962bfe3f2eSlogwang * @param sess security session 4972bfe3f2eSlogwang * @param stats statistics 4982bfe3f2eSlogwang * @return 4992bfe3f2eSlogwang * - On success return 0 5002bfe3f2eSlogwang * - On failure errno 5012bfe3f2eSlogwang */ 502*d30ea906Sjfb8856606 int __rte_experimental 5032bfe3f2eSlogwang rte_security_session_stats_get(struct rte_security_ctx *instance, 5042bfe3f2eSlogwang struct rte_security_session *sess, 5052bfe3f2eSlogwang struct rte_security_stats *stats); 5062bfe3f2eSlogwang 5072bfe3f2eSlogwang /** 5082bfe3f2eSlogwang * Security capability definition 5092bfe3f2eSlogwang */ 5102bfe3f2eSlogwang struct rte_security_capability { 5112bfe3f2eSlogwang enum rte_security_session_action_type action; 5122bfe3f2eSlogwang /**< Security action type*/ 5132bfe3f2eSlogwang enum rte_security_session_protocol protocol; 5142bfe3f2eSlogwang /**< Security protocol */ 5152bfe3f2eSlogwang RTE_STD_C11 5162bfe3f2eSlogwang union { 5172bfe3f2eSlogwang struct { 5182bfe3f2eSlogwang enum rte_security_ipsec_sa_protocol proto; 5192bfe3f2eSlogwang /**< IPsec SA protocol */ 5202bfe3f2eSlogwang enum rte_security_ipsec_sa_mode mode; 5212bfe3f2eSlogwang /**< IPsec SA mode */ 5222bfe3f2eSlogwang enum rte_security_ipsec_sa_direction direction; 5232bfe3f2eSlogwang /**< IPsec SA direction */ 5242bfe3f2eSlogwang struct rte_security_ipsec_sa_options options; 5252bfe3f2eSlogwang /**< IPsec SA supported options */ 5262bfe3f2eSlogwang } ipsec; 5272bfe3f2eSlogwang /**< IPsec capability */ 5282bfe3f2eSlogwang struct { 5292bfe3f2eSlogwang /* To be Filled */ 5302bfe3f2eSlogwang int dummy; 5312bfe3f2eSlogwang } macsec; 5322bfe3f2eSlogwang /**< MACsec capability */ 533*d30ea906Sjfb8856606 struct { 534*d30ea906Sjfb8856606 enum rte_security_pdcp_domain domain; 535*d30ea906Sjfb8856606 /**< PDCP mode of operation: Control or data */ 536*d30ea906Sjfb8856606 uint32_t capa_flags; 537*d30ea906Sjfb8856606 /**< Capabilitity flags, see RTE_SECURITY_PDCP_* */ 538*d30ea906Sjfb8856606 } pdcp; 539*d30ea906Sjfb8856606 /**< PDCP capability */ 5402bfe3f2eSlogwang }; 5412bfe3f2eSlogwang 5422bfe3f2eSlogwang const struct rte_cryptodev_capabilities *crypto_capabilities; 5432bfe3f2eSlogwang /**< Corresponding crypto capabilities for security capability */ 5442bfe3f2eSlogwang 5452bfe3f2eSlogwang uint32_t ol_flags; 5462bfe3f2eSlogwang /**< Device offload flags */ 5472bfe3f2eSlogwang }; 5482bfe3f2eSlogwang 549*d30ea906Sjfb8856606 /** Underlying Hardware/driver which support PDCP may or may not support 550*d30ea906Sjfb8856606 * packet ordering. Set RTE_SECURITY_PDCP_ORDERING_CAP if it support. 551*d30ea906Sjfb8856606 * If it is not set, driver/HW assumes packets received are in order 552*d30ea906Sjfb8856606 * and it will be application's responsibility to maintain ordering. 553*d30ea906Sjfb8856606 */ 554*d30ea906Sjfb8856606 #define RTE_SECURITY_PDCP_ORDERING_CAP 0x00000001 555*d30ea906Sjfb8856606 556*d30ea906Sjfb8856606 /** Underlying Hardware/driver which support PDCP may or may not detect 557*d30ea906Sjfb8856606 * duplicate packet. Set RTE_SECURITY_PDCP_DUP_DETECT_CAP if it support. 558*d30ea906Sjfb8856606 * If it is not set, driver/HW assumes there is no duplicate packet received. 559*d30ea906Sjfb8856606 */ 560*d30ea906Sjfb8856606 #define RTE_SECURITY_PDCP_DUP_DETECT_CAP 0x00000002 561*d30ea906Sjfb8856606 5622bfe3f2eSlogwang #define RTE_SECURITY_TX_OLOAD_NEED_MDATA 0x00000001 5632bfe3f2eSlogwang /**< HW needs metadata update, see rte_security_set_pkt_metadata(). 5642bfe3f2eSlogwang */ 5652bfe3f2eSlogwang 5662bfe3f2eSlogwang #define RTE_SECURITY_TX_HW_TRAILER_OFFLOAD 0x00000002 5672bfe3f2eSlogwang /**< HW constructs trailer of packets 5682bfe3f2eSlogwang * Transmitted packets will have the trailer added to them 5692bfe3f2eSlogwang * by hardawre. The next protocol field will be based on 5702bfe3f2eSlogwang * the mbuf->inner_esp_next_proto field. 5712bfe3f2eSlogwang */ 5722bfe3f2eSlogwang #define RTE_SECURITY_RX_HW_TRAILER_OFFLOAD 0x00010000 5732bfe3f2eSlogwang /**< HW removes trailer of packets 5742bfe3f2eSlogwang * Received packets have no trailer, the next protocol field 5752bfe3f2eSlogwang * is supplied in the mbuf->inner_esp_next_proto field. 5762bfe3f2eSlogwang * Inner packet is not modified. 5772bfe3f2eSlogwang */ 5782bfe3f2eSlogwang 5792bfe3f2eSlogwang /** 5802bfe3f2eSlogwang * Security capability index used to query a security instance for a specific 5812bfe3f2eSlogwang * security capability 5822bfe3f2eSlogwang */ 5832bfe3f2eSlogwang struct rte_security_capability_idx { 5842bfe3f2eSlogwang enum rte_security_session_action_type action; 5852bfe3f2eSlogwang enum rte_security_session_protocol protocol; 5862bfe3f2eSlogwang 5872bfe3f2eSlogwang RTE_STD_C11 5882bfe3f2eSlogwang union { 5892bfe3f2eSlogwang struct { 5902bfe3f2eSlogwang enum rte_security_ipsec_sa_protocol proto; 5912bfe3f2eSlogwang enum rte_security_ipsec_sa_mode mode; 5922bfe3f2eSlogwang enum rte_security_ipsec_sa_direction direction; 5932bfe3f2eSlogwang } ipsec; 594*d30ea906Sjfb8856606 struct { 595*d30ea906Sjfb8856606 enum rte_security_pdcp_domain domain; 596*d30ea906Sjfb8856606 uint32_t capa_flags; 597*d30ea906Sjfb8856606 } pdcp; 5982bfe3f2eSlogwang }; 5992bfe3f2eSlogwang }; 6002bfe3f2eSlogwang 6012bfe3f2eSlogwang /** 6022bfe3f2eSlogwang * Returns array of security instance capabilities 6032bfe3f2eSlogwang * 6042bfe3f2eSlogwang * @param instance Security instance. 6052bfe3f2eSlogwang * 6062bfe3f2eSlogwang * @return 6072bfe3f2eSlogwang * - Returns array of security capabilities. 6082bfe3f2eSlogwang * - Return NULL if no capabilities available. 6092bfe3f2eSlogwang */ 6102bfe3f2eSlogwang const struct rte_security_capability * 6112bfe3f2eSlogwang rte_security_capabilities_get(struct rte_security_ctx *instance); 6122bfe3f2eSlogwang 6132bfe3f2eSlogwang /** 6142bfe3f2eSlogwang * Query if a specific capability is available on security instance 6152bfe3f2eSlogwang * 6162bfe3f2eSlogwang * @param instance security instance. 6172bfe3f2eSlogwang * @param idx security capability index to match against 6182bfe3f2eSlogwang * 6192bfe3f2eSlogwang * @return 6202bfe3f2eSlogwang * - Returns pointer to security capability on match of capability 6212bfe3f2eSlogwang * index criteria. 6222bfe3f2eSlogwang * - Return NULL if the capability not matched on security instance. 6232bfe3f2eSlogwang */ 6242bfe3f2eSlogwang const struct rte_security_capability * 6252bfe3f2eSlogwang rte_security_capability_get(struct rte_security_ctx *instance, 6262bfe3f2eSlogwang struct rte_security_capability_idx *idx); 6272bfe3f2eSlogwang 6282bfe3f2eSlogwang #ifdef __cplusplus 6292bfe3f2eSlogwang } 6302bfe3f2eSlogwang #endif 6312bfe3f2eSlogwang 6322bfe3f2eSlogwang #endif /* _RTE_SECURITY_H_ */ 633