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_
9 #include <rte_compat.h>
12 * @file rte_ipsec_sad.h
13 * @b EXPERIMENTAL: this API may change without prior notice
15 * RTE IPsec security association database (SAD) support.
16 * Contains helper functions to lookup and maintain SAD
27 RTE_IPSEC_SAD_SPI_ONLY = 0,
28 RTE_IPSEC_SAD_SPI_DIP,
29 RTE_IPSEC_SAD_SPI_DIP_SIP,
30 RTE_IPSEC_SAD_KEY_TYPE_MASK,
33 struct rte_ipsec_sadv4_key {
39 struct rte_ipsec_sadv6_key {
45 union rte_ipsec_sad_key {
46 struct rte_ipsec_sadv4_key v4;
47 struct rte_ipsec_sadv6_key v6;
50 /** Flag to create SAD with ipv6 dip and sip addresses */
51 #define RTE_IPSEC_SAD_FLAG_IPV6 0x1
52 /** Flag to support reader writer concurrency */
53 #define RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY 0x2
55 /** IPsec SAD configuration structure */
56 struct rte_ipsec_sad_conf {
57 /** CPU socket ID where rte_ipsec_sad should be allocated */
59 /** maximum number of SA for each type of key */
60 uint32_t max_sa[RTE_IPSEC_SAD_KEY_TYPE_MASK];
61 /** RTE_IPSEC_SAD_FLAG_* flags */
66 * Add a rule into the SAD. Could be safely called with concurrent lookups
67 * if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
68 * While with this flag multi-reader - one-writer model Is MT safe,
69 * multi-writer model is not and required extra synchronisation.
76 * key type (spi only/spi+dip/spi+dip+sip)
78 * Pointer associated with the key to save in a SAD
79 * Must be 4 bytes aligned.
81 * 0 on success, negative value otherwise
85 rte_ipsec_sad_add(struct rte_ipsec_sad *sad,
86 const union rte_ipsec_sad_key *key,
87 int key_type, void *sa);
90 * Delete a rule from the SAD. Could be safely called with concurrent lookups
91 * if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
92 * While with this flag multi-reader - one-writer model Is MT safe,
93 * multi-writer model is not and required extra synchronisation.
100 * key type (spi only/spi+dip/spi+dip+sip)
102 * 0 on success, negative value otherwise
106 rte_ipsec_sad_del(struct rte_ipsec_sad *sad,
107 const union rte_ipsec_sad_key *key,
115 * Structure containing the configuration
117 * Handle to SAD object on success
118 * 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.
135 struct rte_ipsec_sad *
136 rte_ipsec_sad_find_existing(const char *name);
139 * Destroy SAD object.
142 * pointer to the SAD object
148 rte_ipsec_sad_destroy(struct rte_ipsec_sad *sad);
151 * Lookup multiple keys in the SAD.
156 * Array of keys to be looked up in the SAD
158 * Pointer assocoated with the keys.
159 * If the lookup for the given key failed, then corresponding sa
162 * Number of elements in keys array to lookup.
164 * -EINVAL for incorrect arguments, otherwise number of successful lookups.
168 rte_ipsec_sad_lookup(const struct rte_ipsec_sad *sad,
169 const union rte_ipsec_sad_key *keys[],
170 void *sa[], uint32_t n);
176 #endif /* _RTE_IPSEC_SAD_H_ */