3a3342dacb726d03be28071d38909631b8aee5d3
[deb_dpdk.git] / lib / librte_lpm / rte_lpm6.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 #ifndef _RTE_LPM6_H_
34 #define _RTE_LPM6_H_
35
36 /**
37  * @file
38  * RTE Longest Prefix Match for IPv6 (LPM6)
39  */
40
41 #include <stdint.h>
42 #include <rte_compat.h>
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48
49 #define RTE_LPM6_MAX_DEPTH               128
50 #define RTE_LPM6_IPV6_ADDR_SIZE           16
51 /** Max number of characters in LPM name. */
52 #define RTE_LPM6_NAMESIZE                 32
53
54 /** LPM structure. */
55 struct rte_lpm6;
56
57 /** LPM configuration structure. */
58 struct rte_lpm6_config {
59         uint32_t max_rules;      /**< Max number of rules. */
60         uint32_t number_tbl8s;   /**< Number of tbl8s to allocate. */
61         int flags;               /**< This field is currently unused. */
62 };
63
64 /**
65  * Create an LPM object.
66  *
67  * @param name
68  *   LPM object name
69  * @param socket_id
70  *   NUMA socket ID for LPM table memory allocation
71  * @param config
72  *   Structure containing the configuration
73  * @return
74  *   Handle to LPM object on success, NULL otherwise with rte_errno set
75  *   to an appropriate values. Possible rte_errno values include:
76  *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
77  *    - E_RTE_SECONDARY - function was called from a secondary process instance
78  *    - EINVAL - invalid parameter passed to function
79  *    - ENOSPC - the maximum number of memzones has already been allocated
80  *    - EEXIST - a memzone with the same name already exists
81  *    - ENOMEM - no appropriate memory area found in which to create memzone
82  */
83 struct rte_lpm6 *
84 rte_lpm6_create(const char *name, int socket_id,
85                 const struct rte_lpm6_config *config);
86
87 /**
88  * Find an existing LPM object and return a pointer to it.
89  *
90  * @param name
91  *   Name of the lpm object as passed to rte_lpm6_create()
92  * @return
93  *   Pointer to lpm object or NULL if object not found with rte_errno
94  *   set appropriately. Possible rte_errno values include:
95  *    - ENOENT - required entry not available to return.
96  */
97 struct rte_lpm6 *
98 rte_lpm6_find_existing(const char *name);
99
100 /**
101  * Free an LPM object.
102  *
103  * @param lpm
104  *   LPM object handle
105  * @return
106  *   None
107  */
108 void
109 rte_lpm6_free(struct rte_lpm6 *lpm);
110
111 /**
112  * Add a rule to the LPM table.
113  *
114  * @param lpm
115  *   LPM object handle
116  * @param ip
117  *   IP of the rule to be added to the LPM table
118  * @param depth
119  *   Depth of the rule to be added to the LPM table
120  * @param next_hop
121  *   Next hop of the rule to be added to the LPM table
122  * @return
123  *   0 on success, negative value otherwise
124  */
125 int
126 rte_lpm6_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
127                 uint32_t next_hop);
128 int
129 rte_lpm6_add_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
130                 uint8_t next_hop);
131 int
132 rte_lpm6_add_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
133                 uint32_t next_hop);
134
135 /**
136  * Check if a rule is present in the LPM table,
137  * and provide its next hop if it is.
138  *
139  * @param lpm
140  *   LPM object handle
141  * @param ip
142  *   IP of the rule to be searched
143  * @param depth
144  *   Depth of the rule to searched
145  * @param next_hop
146  *   Next hop of the rule (valid only if it is found)
147  * @return
148  *   1 if the rule exists, 0 if it does not, a negative value on failure
149  */
150 int
151 rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
152                 uint32_t *next_hop);
153 int
154 rte_lpm6_is_rule_present_v20(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
155                 uint8_t *next_hop);
156 int
157 rte_lpm6_is_rule_present_v1705(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth,
158                 uint32_t *next_hop);
159
160 /**
161  * Delete a rule from the LPM table.
162  *
163  * @param lpm
164  *   LPM object handle
165  * @param ip
166  *   IP of the rule to be deleted from the LPM table
167  * @param depth
168  *   Depth of the rule to be deleted from the LPM table
169  * @return
170  *   0 on success, negative value otherwise
171  */
172 int
173 rte_lpm6_delete(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth);
174
175 /**
176  * Delete a rule from the LPM table.
177  *
178  * @param lpm
179  *   LPM object handle
180  * @param ips
181  *   Array of IPs to be deleted from the LPM table
182  * @param depths
183  *   Array of depths of the rules to be deleted from the LPM table
184  * @param n
185  *   Number of rules to be deleted from the LPM table
186  * @return
187  *   0 on success, negative value otherwise.
188  */
189 int
190 rte_lpm6_delete_bulk_func(struct rte_lpm6 *lpm,
191                 uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], uint8_t *depths, unsigned n);
192
193 /**
194  * Delete all rules from the LPM table.
195  *
196  * @param lpm
197  *   LPM object handle
198  */
199 void
200 rte_lpm6_delete_all(struct rte_lpm6 *lpm);
201
202 /**
203  * Lookup an IP into the LPM table.
204  *
205  * @param lpm
206  *   LPM object handle
207  * @param ip
208  *   IP to be looked up in the LPM table
209  * @param next_hop
210  *   Next hop of the most specific rule found for IP (valid on lookup hit only)
211  * @return
212  *   -EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit
213  */
214 int
215 rte_lpm6_lookup(const struct rte_lpm6 *lpm, uint8_t *ip, uint32_t *next_hop);
216 int
217 rte_lpm6_lookup_v20(const struct rte_lpm6 *lpm, uint8_t *ip, uint8_t *next_hop);
218 int
219 rte_lpm6_lookup_v1705(const struct rte_lpm6 *lpm, uint8_t *ip,
220                 uint32_t *next_hop);
221
222 /**
223  * Lookup multiple IP addresses in an LPM table.
224  *
225  * @param lpm
226  *   LPM object handle
227  * @param ips
228  *   Array of IPs to be looked up in the LPM table
229  * @param next_hops
230  *   Next hop of the most specific rule found for IP (valid on lookup hit only).
231  *   This is an array of two byte values. The next hop will be stored on
232  *   each position on success; otherwise the position will be set to -1.
233  * @param n
234  *   Number of elements in ips (and next_hops) array to lookup.
235  *  @return
236  *   -EINVAL for incorrect arguments, otherwise 0
237  */
238 int
239 rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
240                 uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
241                 int32_t *next_hops, unsigned int n);
242 int
243 rte_lpm6_lookup_bulk_func_v20(const struct rte_lpm6 *lpm,
244                 uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
245                 int16_t *next_hops, unsigned int n);
246 int
247 rte_lpm6_lookup_bulk_func_v1705(const struct rte_lpm6 *lpm,
248                 uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
249                 int32_t *next_hops, unsigned int n);
250
251 #ifdef __cplusplus
252 }
253 #endif
254
255 #endif