xref: /freebsd/sys/contrib/dpdk_rte_lpm/rte_lpm6.h (revision 537d134373141c2d25bfb24af6d661d0e6102927)
1*537d1343SAlexander V. Chernikov /* SPDX-License-Identifier: BSD-3-Clause
2*537d1343SAlexander V. Chernikov  * Copyright(c) 2010-2014 Intel Corporation
3*537d1343SAlexander V. Chernikov  */
4*537d1343SAlexander V. Chernikov #ifndef _RTE_LPM6_H_
5*537d1343SAlexander V. Chernikov #define _RTE_LPM6_H_
6*537d1343SAlexander V. Chernikov 
7*537d1343SAlexander V. Chernikov /**
8*537d1343SAlexander V. Chernikov  * @file
9*537d1343SAlexander V. Chernikov  * RTE Longest Prefix Match for IPv6 (LPM6)
10*537d1343SAlexander V. Chernikov  */
11*537d1343SAlexander V. Chernikov 
12*537d1343SAlexander V. Chernikov #ifdef __cplusplus
13*537d1343SAlexander V. Chernikov extern "C" {
14*537d1343SAlexander V. Chernikov #endif
15*537d1343SAlexander V. Chernikov 
16*537d1343SAlexander V. Chernikov 
17*537d1343SAlexander V. Chernikov #define RTE_LPM6_MAX_DEPTH               128
18*537d1343SAlexander V. Chernikov #define RTE_LPM6_IPV6_ADDR_SIZE           16
19*537d1343SAlexander V. Chernikov /** Max number of characters in LPM name. */
20*537d1343SAlexander V. Chernikov #define RTE_LPM6_NAMESIZE                 32
21*537d1343SAlexander V. Chernikov 
22*537d1343SAlexander V. Chernikov /** LPM structure. */
23*537d1343SAlexander V. Chernikov struct rte_lpm6;
24*537d1343SAlexander V. Chernikov 
25*537d1343SAlexander V. Chernikov struct nhop_object;
26*537d1343SAlexander V. Chernikov struct rte_lpm6_external {
27*537d1343SAlexander V. Chernikov 	struct nhop_object	**nh_idx;	/**< # -> idx mappings  */
28*537d1343SAlexander V. Chernikov 	uint32_t		default_idx;	/* nhop index of default route */
29*537d1343SAlexander V. Chernikov 	uint32_t		fibnum;		/* fib index */
30*537d1343SAlexander V. Chernikov };
31*537d1343SAlexander V. Chernikov 
32*537d1343SAlexander V. Chernikov /** LPM configuration structure. */
33*537d1343SAlexander V. Chernikov struct rte_lpm6_config {
34*537d1343SAlexander V. Chernikov 	uint32_t max_rules;      /**< Max number of rules. */
35*537d1343SAlexander V. Chernikov 	uint32_t number_tbl8s;   /**< Number of tbl8s to allocate. */
36*537d1343SAlexander V. Chernikov 	int flags;               /**< This field is currently unused. */
37*537d1343SAlexander V. Chernikov };
38*537d1343SAlexander V. Chernikov 
39*537d1343SAlexander V. Chernikov #define	RTE_LPM6_RULE_SIZE	32
40*537d1343SAlexander V. Chernikov struct rte_lpm6_rule *fill_rule6(char *buffer, const uint8_t *ip,
41*537d1343SAlexander V. Chernikov 				uint8_t depth, uint32_t next_hop);
42*537d1343SAlexander V. Chernikov /**
43*537d1343SAlexander V. Chernikov  * Create an LPM object.
44*537d1343SAlexander V. Chernikov  *
45*537d1343SAlexander V. Chernikov  * @param name
46*537d1343SAlexander V. Chernikov  *   LPM object name
47*537d1343SAlexander V. Chernikov  * @param socket_id
48*537d1343SAlexander V. Chernikov  *   NUMA socket ID for LPM table memory allocation
49*537d1343SAlexander V. Chernikov  * @param config
50*537d1343SAlexander V. Chernikov  *   Structure containing the configuration
51*537d1343SAlexander V. Chernikov  * @return
52*537d1343SAlexander V. Chernikov  *   Handle to LPM object on success, NULL otherwise with rte_errno set
53*537d1343SAlexander V. Chernikov  *   to an appropriate values. Possible rte_errno values include:
54*537d1343SAlexander V. Chernikov  *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
55*537d1343SAlexander V. Chernikov  *    - E_RTE_SECONDARY - function was called from a secondary process instance
56*537d1343SAlexander V. Chernikov  *    - EINVAL - invalid parameter passed to function
57*537d1343SAlexander V. Chernikov  *    - ENOSPC - the maximum number of memzones has already been allocated
58*537d1343SAlexander V. Chernikov  *    - EEXIST - a memzone with the same name already exists
59*537d1343SAlexander V. Chernikov  *    - ENOMEM - no appropriate memory area found in which to create memzone
60*537d1343SAlexander V. Chernikov  */
61*537d1343SAlexander V. Chernikov struct rte_lpm6 *
62*537d1343SAlexander V. Chernikov rte_lpm6_create(const char *name, int socket_id,
63*537d1343SAlexander V. Chernikov 		const struct rte_lpm6_config *config);
64*537d1343SAlexander V. Chernikov 
65*537d1343SAlexander V. Chernikov /**
66*537d1343SAlexander V. Chernikov  * Find an existing LPM object and return a pointer to it.
67*537d1343SAlexander V. Chernikov  *
68*537d1343SAlexander V. Chernikov  * @param name
69*537d1343SAlexander V. Chernikov  *   Name of the lpm object as passed to rte_lpm6_create()
70*537d1343SAlexander V. Chernikov  * @return
71*537d1343SAlexander V. Chernikov  *   Pointer to lpm object or NULL if object not found with rte_errno
72*537d1343SAlexander V. Chernikov  *   set appropriately. Possible rte_errno values include:
73*537d1343SAlexander V. Chernikov  *    - ENOENT - required entry not available to return.
74*537d1343SAlexander V. Chernikov  */
75*537d1343SAlexander V. Chernikov struct rte_lpm6 *
76*537d1343SAlexander V. Chernikov rte_lpm6_find_existing(const char *name);
77*537d1343SAlexander V. Chernikov 
78*537d1343SAlexander V. Chernikov /**
79*537d1343SAlexander V. Chernikov  * Free an LPM object.
80*537d1343SAlexander V. Chernikov  *
81*537d1343SAlexander V. Chernikov  * @param lpm
82*537d1343SAlexander V. Chernikov  *   LPM object handle
83*537d1343SAlexander V. Chernikov  * @return
84*537d1343SAlexander V. Chernikov  *   None
85*537d1343SAlexander V. Chernikov  */
86*537d1343SAlexander V. Chernikov void
87*537d1343SAlexander V. Chernikov rte_lpm6_free(struct rte_lpm6 *lpm);
88*537d1343SAlexander V. Chernikov 
89*537d1343SAlexander V. Chernikov /**
90*537d1343SAlexander V. Chernikov  * Add a rule to the LPM table.
91*537d1343SAlexander V. Chernikov  *
92*537d1343SAlexander V. Chernikov  * @param lpm
93*537d1343SAlexander V. Chernikov  *   LPM object handle
94*537d1343SAlexander V. Chernikov  * @param ip
95*537d1343SAlexander V. Chernikov  *   IP of the rule to be added to the LPM table
96*537d1343SAlexander V. Chernikov  * @param depth
97*537d1343SAlexander V. Chernikov  *   Depth of the rule to be added to the LPM table
98*537d1343SAlexander V. Chernikov  * @param next_hop
99*537d1343SAlexander V. Chernikov  *   Next hop of the rule to be added to the LPM table
100*537d1343SAlexander V. Chernikov  * @return
101*537d1343SAlexander V. Chernikov  *   0 on success, negative value otherwise
102*537d1343SAlexander V. Chernikov  */
103*537d1343SAlexander V. Chernikov int
104*537d1343SAlexander V. Chernikov rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth,
105*537d1343SAlexander V. Chernikov 	     uint32_t next_hop, int is_new_rule);
106*537d1343SAlexander V. Chernikov 
107*537d1343SAlexander V. Chernikov /**
108*537d1343SAlexander V. Chernikov  * Check if a rule is present in the LPM table,
109*537d1343SAlexander V. Chernikov  * and provide its next hop if it is.
110*537d1343SAlexander V. Chernikov  *
111*537d1343SAlexander V. Chernikov  * @param lpm
112*537d1343SAlexander V. Chernikov  *   LPM object handle
113*537d1343SAlexander V. Chernikov  * @param ip
114*537d1343SAlexander V. Chernikov  *   IP of the rule to be searched
115*537d1343SAlexander V. Chernikov  * @param depth
116*537d1343SAlexander V. Chernikov  *   Depth of the rule to searched
117*537d1343SAlexander V. Chernikov  * @param next_hop
118*537d1343SAlexander V. Chernikov  *   Next hop of the rule (valid only if it is found)
119*537d1343SAlexander V. Chernikov  * @return
120*537d1343SAlexander V. Chernikov  *   1 if the rule exists, 0 if it does not, a negative value on failure
121*537d1343SAlexander V. Chernikov  */
122*537d1343SAlexander V. Chernikov int
123*537d1343SAlexander V. Chernikov rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth,
124*537d1343SAlexander V. Chernikov 			 uint32_t *next_hop);
125*537d1343SAlexander V. Chernikov 
126*537d1343SAlexander V. Chernikov /**
127*537d1343SAlexander V. Chernikov  * Delete a rule from the LPM table.
128*537d1343SAlexander V. Chernikov  *
129*537d1343SAlexander V. Chernikov  * @param lpm
130*537d1343SAlexander V. Chernikov  *   LPM object handle
131*537d1343SAlexander V. Chernikov  * @param ip
132*537d1343SAlexander V. Chernikov  *   IP of the rule to be deleted from the LPM table
133*537d1343SAlexander V. Chernikov  * @param depth
134*537d1343SAlexander V. Chernikov  *   Depth of the rule to be deleted from the LPM table
135*537d1343SAlexander V. Chernikov  * @return
136*537d1343SAlexander V. Chernikov  *   0 on success, negative value otherwise
137*537d1343SAlexander V. Chernikov  */
138*537d1343SAlexander V. Chernikov int
139*537d1343SAlexander V. Chernikov rte_lpm6_delete(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth,
140*537d1343SAlexander V. Chernikov 			struct rte_lpm6_rule *lsp_rule);
141*537d1343SAlexander V. Chernikov 
142*537d1343SAlexander V. Chernikov /**
143*537d1343SAlexander V. Chernikov  * Delete a rule from the LPM table.
144*537d1343SAlexander V. Chernikov  *
145*537d1343SAlexander V. Chernikov  * @param lpm
146*537d1343SAlexander V. Chernikov  *   LPM object handle
147*537d1343SAlexander V. Chernikov  * @param ips
148*537d1343SAlexander V. Chernikov  *   Array of IPs to be deleted from the LPM table
149*537d1343SAlexander V. Chernikov  * @param depths
150*537d1343SAlexander V. Chernikov  *   Array of depths of the rules to be deleted from the LPM table
151*537d1343SAlexander V. Chernikov  * @param n
152*537d1343SAlexander V. Chernikov  *   Number of rules to be deleted from the LPM table
153*537d1343SAlexander V. Chernikov  * @return
154*537d1343SAlexander V. Chernikov  *   0 on success, negative value otherwise.
155*537d1343SAlexander V. Chernikov  */
156*537d1343SAlexander V. Chernikov int
157*537d1343SAlexander V. Chernikov rte_lpm6_delete_bulk_func(struct rte_lpm6 *lpm,
158*537d1343SAlexander V. Chernikov 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], uint8_t *depths, unsigned n);
159*537d1343SAlexander V. Chernikov 
160*537d1343SAlexander V. Chernikov /**
161*537d1343SAlexander V. Chernikov  * Delete all rules from the LPM table.
162*537d1343SAlexander V. Chernikov  *
163*537d1343SAlexander V. Chernikov  * @param lpm
164*537d1343SAlexander V. Chernikov  *   LPM object handle
165*537d1343SAlexander V. Chernikov  */
166*537d1343SAlexander V. Chernikov void
167*537d1343SAlexander V. Chernikov rte_lpm6_delete_all(struct rte_lpm6 *lpm);
168*537d1343SAlexander V. Chernikov 
169*537d1343SAlexander V. Chernikov /**
170*537d1343SAlexander V. Chernikov  * Lookup an IP into the LPM table.
171*537d1343SAlexander V. Chernikov  *
172*537d1343SAlexander V. Chernikov  * @param lpm
173*537d1343SAlexander V. Chernikov  *   LPM object handle
174*537d1343SAlexander V. Chernikov  * @param ip
175*537d1343SAlexander V. Chernikov  *   IP to be looked up in the LPM table
176*537d1343SAlexander V. Chernikov  * @param next_hop
177*537d1343SAlexander V. Chernikov  *   Next hop of the most specific rule found for IP (valid on lookup hit only)
178*537d1343SAlexander V. Chernikov  * @return
179*537d1343SAlexander V. Chernikov  *   -EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit
180*537d1343SAlexander V. Chernikov  */
181*537d1343SAlexander V. Chernikov int
182*537d1343SAlexander V. Chernikov rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, uint32_t *next_hop);
183*537d1343SAlexander V. Chernikov 
184*537d1343SAlexander V. Chernikov /**
185*537d1343SAlexander V. Chernikov  * Lookup multiple IP addresses in an LPM table.
186*537d1343SAlexander V. Chernikov  *
187*537d1343SAlexander V. Chernikov  * @param lpm
188*537d1343SAlexander V. Chernikov  *   LPM object handle
189*537d1343SAlexander V. Chernikov  * @param ips
190*537d1343SAlexander V. Chernikov  *   Array of IPs to be looked up in the LPM table
191*537d1343SAlexander V. Chernikov  * @param next_hops
192*537d1343SAlexander V. Chernikov  *   Next hop of the most specific rule found for IP (valid on lookup hit only).
193*537d1343SAlexander V. Chernikov  *   This is an array of two byte values. The next hop will be stored on
194*537d1343SAlexander V. Chernikov  *   each position on success; otherwise the position will be set to -1.
195*537d1343SAlexander V. Chernikov  * @param n
196*537d1343SAlexander V. Chernikov  *   Number of elements in ips (and next_hops) array to lookup.
197*537d1343SAlexander V. Chernikov  *  @return
198*537d1343SAlexander V. Chernikov  *   -EINVAL for incorrect arguments, otherwise 0
199*537d1343SAlexander V. Chernikov  */
200*537d1343SAlexander V. Chernikov int
201*537d1343SAlexander V. Chernikov rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm,
202*537d1343SAlexander V. Chernikov 		uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE],
203*537d1343SAlexander V. Chernikov 		int32_t *next_hops, unsigned int n);
204*537d1343SAlexander V. Chernikov 
205*537d1343SAlexander V. Chernikov #ifdef __cplusplus
206*537d1343SAlexander V. Chernikov }
207*537d1343SAlexander V. Chernikov #endif
208*537d1343SAlexander V. Chernikov 
209*537d1343SAlexander V. Chernikov #endif
210