2 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2019 Intel Corporation
6 #ifndef _RTE_IPSEC_SAD_H_
7 #define _RTE_IPSEC_SAD_H_
11 #include <rte_compat.h>
14 * @file rte_ipsec_sad.h
16 * RTE IPsec security association database (SAD) support.
17 * Contains helper functions to lookup and maintain SAD
28 RTE_IPSEC_SAD_SPI_ONLY = 0,
29 RTE_IPSEC_SAD_SPI_DIP,
30 RTE_IPSEC_SAD_SPI_DIP_SIP,
31 RTE_IPSEC_SAD_KEY_TYPE_MASK,
34 struct rte_ipsec_sadv4_key {
40 struct rte_ipsec_sadv6_key {
46 union rte_ipsec_sad_key {
47 struct rte_ipsec_sadv4_key v4;
48 struct rte_ipsec_sadv6_key v6;
51 /** Max number of characters in SAD name. */
52 #define RTE_IPSEC_SAD_NAMESIZE 64
53 /** Flag to create SAD with ipv6 dip and sip addresses */
54 #define RTE_IPSEC_SAD_FLAG_IPV6 0x1
55 /** Flag to support reader writer concurrency */
56 #define RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY 0x2
58 /** IPsec SAD configuration structure */
59 struct rte_ipsec_sad_conf {
60 /** CPU socket ID where rte_ipsec_sad should be allocated */
62 /** maximum number of SA for each type of key */
63 uint32_t max_sa[RTE_IPSEC_SAD_KEY_TYPE_MASK];
64 /** RTE_IPSEC_SAD_FLAG_* flags */
69 * Add a rule into the SAD. Could be safely called with concurrent lookups
70 * if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
71 * While with this flag multi-reader - one-writer model Is MT safe,
72 * multi-writer model is not and required extra synchronisation.
79 * key type (spi only/spi+dip/spi+dip+sip)
81 * Pointer associated with the key to save in a SAD
82 * Must be 4 bytes aligned.
84 * 0 on success, negative value otherwise
87 rte_ipsec_sad_add(struct rte_ipsec_sad *sad,
88 const union rte_ipsec_sad_key *key,
89 int key_type, void *sa);
92 * Delete a rule from the SAD. Could be safely called with concurrent lookups
93 * if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
94 * While with this flag multi-reader - one-writer model Is MT safe,
95 * multi-writer model is not and required extra synchronisation.
102 * key type (spi only/spi+dip/spi+dip+sip)
104 * 0 on success, negative value otherwise
107 rte_ipsec_sad_del(struct rte_ipsec_sad *sad,
108 const union rte_ipsec_sad_key *key,
116 * Structure containing the configuration
118 * Handle to SAD object on success
119 * NULL otherwise with rte_errno set to an appropriate values.
121 struct rte_ipsec_sad *
122 rte_ipsec_sad_create(const char *name, const struct rte_ipsec_sad_conf *conf);
125 * Find an existing SAD object and return a pointer to it.
128 * Name of the SAD object as passed to rte_ipsec_sad_create()
130 * Pointer to sad object or NULL if object not found with rte_errno
131 * set appropriately. Possible rte_errno values include:
132 * - ENOENT - required entry not available to return.
134 struct rte_ipsec_sad *
135 rte_ipsec_sad_find_existing(const char *name);
138 * Destroy SAD object.
141 * pointer to the SAD object
146 rte_ipsec_sad_destroy(struct rte_ipsec_sad *sad);
149 * Lookup multiple keys in the SAD.
154 * Array of keys to be looked up in the SAD
156 * Pointer assocoated with the keys.
157 * If the lookup for the given key failed, then corresponding sa
160 * Number of elements in keys array to lookup.
162 * -EINVAL for incorrect arguments, otherwise number of successful lookups.
165 rte_ipsec_sad_lookup(const struct rte_ipsec_sad *sad,
166 const union rte_ipsec_sad_key *keys[],
167 void *sa[], uint32_t n);
173 #endif /* _RTE_IPSEC_SAD_H_ */