1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2019 Intel Corporation
*/
#ifndef _RTE_IPSEC_SAD_H_
#define _RTE_IPSEC_SAD_H_
#include <rte_compat.h>
/**
* @file rte_ipsec_sad.h
* @b EXPERIMENTAL: this API may change without prior notice
*
* RTE IPsec security association database (SAD) support.
* Contains helper functions to lookup and maintain SAD
*/
#ifdef __cplusplus
extern "C" {
#endif
struct rte_ipsec_sad;
/** Type of key */
enum {
RTE_IPSEC_SAD_SPI_ONLY = 0,
RTE_IPSEC_SAD_SPI_DIP,
RTE_IPSEC_SAD_SPI_DIP_SIP,
RTE_IPSEC_SAD_KEY_TYPE_MASK,
};
struct rte_ipsec_sadv4_key {
uint32_t spi;
uint32_t dip;
uint32_t sip;
};
struct rte_ipsec_sadv6_key {
uint32_t spi;
uint8_t dip[16];
uint8_t sip[16];
};
union rte_ipsec_sad_key {
struct rte_ipsec_sadv4_key v4;
struct rte_ipsec_sadv6_key v6;
};
/** Max number of characters in SAD name. */
#define RTE_IPSEC_SAD_NAMESIZE 64
/** Flag to create SAD with ipv6 dip and sip addresses */
#define RTE_IPSEC_SAD_FLAG_IPV6 0x1
/** Flag to support reader writer concurrency */
#define RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY 0x2
/** IPsec SAD configuration structure */
struct rte_ipsec_sad_conf {
/** CPU socket ID where rte_ipsec_sad should be allocated */
int socket_id;
/** maximum number of SA for each type of key */
uint32_t max_sa[RTE_IPSEC_SAD_KEY_TYPE_MASK];
/** RTE_IPSEC_SAD_FLAG_* flags */
uint32_t flags;
};
/**
* Add a rule into the SAD. Could be safely called with concurrent lookups
* if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
* While with this flag multi-reader - one-writer model Is MT safe,
* multi-writer model is not and required extra synchronisation.
*
* @param sad
* SAD object handle
* @param key
* pointer to the key
* @param key_type
* key type (spi only/spi+dip/spi+dip+sip)
* @param sa
* Pointer associated with the key to save in a SAD
* Must be 4 bytes aligned.
* @return
* 0 on success, negative value otherwise
*/
__rte_experimental
int
rte_ipsec_sad_add(struct rte_ipsec_sad *sad,
const union rte_ipsec_sad_key *key,
int key_type, void *sa);
/**
* Delete a rule from the SAD. Could be safely called with concurrent lookups
* if RTE_IPSEC_SAD_FLAG_RW_CONCURRENCY flag was configured on creation time.
* While with this flag multi-reader - one-writer model Is MT safe,
* multi-writer model is not and required extra synchronisation.
*
* @param sad
* SAD object handle
* @param key
* pointer to the key
* @param key_type
* key type (spi only/spi+dip/spi+dip+sip)
* @return
* 0 on success, negative value otherwise
*/
__rte_experimental
int
rte_ipsec_sad_del(struct rte_ipsec_sad *sad,
const union rte_ipsec_sad_key *key,
int key_type);
/*
* Create SAD
*
* @param name
* SAD name
* @param conf
* Structure containing the configuration
* @return
* Handle to SAD object on success
* NULL otherwise with rte_errno set to an appropriate values.
*/
__rte_experimental
struct rte_ipsec_sad *
rte_ipsec_sad_create(const char *name, const struct rte_ipsec_sad_conf *conf);
/**
* Find an existing SAD object and return a pointer to it.
*
* @param name
* Name of the SAD object as passed to rte_ipsec_sad_create()
* @return
* Pointer to sad object or NULL if object not found with rte_errno
* set appropriately. Possible rte_errno values include:
* - ENOENT - required entry not available to return.
*/
__rte_experimental
struct rte_ipsec_sad *
rte_ipsec_sad_find_existing(const char *name);
/**
* Destroy SAD object.
*
* @param sad
* pointer to the SAD object
* @return
* None
*/
__rte_experimental
void
rte_ipsec_sad_destroy(struct rte_ipsec_sad *sad);
/**
* Lookup multiple keys in the SAD.
*
* @param sad
* SAD object handle
* @param keys
* Array of keys to be looked up in the SAD
* @param sa
* Pointer assocoated with the keys.
* If the lookup for the given key failed, then corresponding sa
* will be NULL
* @param n
* Number of elements in keys array to lookup.
* @return
* -EINVAL for incorrect arguments, otherwise number of successful lookups.
*/
__rte_experimental
int
rte_ipsec_sad_lookup(const struct rte_ipsec_sad *sad,
const union rte_ipsec_sad_key *keys[],
void *sa[], uint32_t n);
#ifdef __cplusplus
}
#endif
#endif /* _RTE_IPSEC_SAD_H_ */
|