1/* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2017 Intel Corporation 3 */ 4 5#ifndef IXGBE_IPSEC_H_ 6#define IXGBE_IPSEC_H_ 7 8#include <rte_security.h> 9 10#define IPSRXIDX_RX_EN 0x00000001 11#define IPSRXIDX_TABLE_IP 0x00000002 12#define IPSRXIDX_TABLE_SPI 0x00000004 13#define IPSRXIDX_TABLE_KEY 0x00000006 14#define IPSRXIDX_WRITE 0x80000000 15#define IPSRXIDX_READ 0x40000000 16#define IPSRXMOD_VALID 0x00000001 17#define IPSRXMOD_PROTO 0x00000004 18#define IPSRXMOD_DECRYPT 0x00000008 19#define IPSRXMOD_IPV6 0x00000010 20#define IXGBE_ADVTXD_POPTS_IPSEC 0x00000400 21#define IXGBE_ADVTXD_TUCMD_IPSEC_TYPE_ESP 0x00002000 22#define IXGBE_ADVTXD_TUCMD_IPSEC_ENCRYPT_EN 0x00004000 23#define IXGBE_RXDADV_IPSEC_STATUS_SECP 0x00020000 24#define IXGBE_RXDADV_IPSEC_ERROR_BIT_MASK 0x18000000 25#define IXGBE_RXDADV_IPSEC_ERROR_INVALID_PROTOCOL 0x08000000 26#define IXGBE_RXDADV_IPSEC_ERROR_INVALID_LENGTH 0x10000000 27#define IXGBE_RXDADV_IPSEC_ERROR_AUTHENTICATION_FAILED 0x18000000 28 29#define IPSEC_MAX_RX_IP_COUNT 128 30#define IPSEC_MAX_SA_COUNT 1024 31 32#define ESP_ICV_SIZE 16 33#define ESP_TRAILER_SIZE 2 34 35enum ixgbe_operation { 36 IXGBE_OP_AUTHENTICATED_ENCRYPTION, 37 IXGBE_OP_AUTHENTICATED_DECRYPTION 38}; 39 40enum ixgbe_gcm_key { 41 IXGBE_GCM_KEY_128, 42 IXGBE_GCM_KEY_256 43}; 44 45/** 46 * Generic IP address structure 47 * TODO: Find better location for this rte_net.h possibly. 48 **/ 49struct ipaddr { 50 enum ipaddr_type { 51 IPv4, 52 IPv6 53 } type; 54 /**< IP Address Type - IPv4/IPv6 */ 55 56 union { 57 uint32_t ipv4; 58 uint32_t ipv6[4]; 59 }; 60}; 61 62/** inline crypto crypto private session structure */ 63struct ixgbe_crypto_session { 64 enum ixgbe_operation op; 65 const uint8_t *key; 66 uint32_t key_len; 67 uint32_t salt; 68 uint32_t sa_index; 69 uint32_t spi; 70 struct ipaddr src_ip; 71 struct ipaddr dst_ip; 72 struct rte_eth_dev *dev; 73} __rte_cache_aligned; 74 75struct ixgbe_crypto_rx_ip_table { 76 struct ipaddr ip; 77 uint16_t ref_count; 78}; 79struct ixgbe_crypto_rx_sa_table { 80 uint32_t spi; 81 uint32_t ip_index; 82 uint8_t mode; 83 uint8_t used; 84}; 85 86struct ixgbe_crypto_tx_sa_table { 87 uint32_t spi; 88 uint8_t used; 89}; 90 91union ixgbe_crypto_tx_desc_md { 92 uint64_t data; 93 struct { 94 /**< SA table index */ 95 uint32_t sa_idx; 96 /**< ICV and ESP trailer length */ 97 uint8_t pad_len; 98 /**< enable encryption */ 99 uint8_t enc; 100 }; 101}; 102 103struct ixgbe_ipsec { 104 struct ixgbe_crypto_rx_ip_table rx_ip_tbl[IPSEC_MAX_RX_IP_COUNT]; 105 struct ixgbe_crypto_rx_sa_table rx_sa_tbl[IPSEC_MAX_SA_COUNT]; 106 struct ixgbe_crypto_tx_sa_table tx_sa_tbl[IPSEC_MAX_SA_COUNT]; 107}; 108 109 110int ixgbe_ipsec_ctx_create(struct rte_eth_dev *dev); 111int ixgbe_crypto_enable_ipsec(struct rte_eth_dev *dev); 112int ixgbe_crypto_add_ingress_sa_from_flow(const void *sess, 113 const void *ip_spec, 114 uint8_t is_ipv6); 115 116 117 118#endif /*IXGBE_IPSEC_H_*/ 119