doc: update firmware/driver mapping table for i40e
[dpdk.git] / lib / librte_table / rte_swx_table.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2020 Intel Corporation
3  */
4 #ifndef __INCLUDE_RTE_SWX_TABLE_H__
5 #define __INCLUDE_RTE_SWX_TABLE_H__
6
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10
11 /**
12  * @file
13  * RTE SWX Table
14  *
15  * Table interface.
16  */
17
18 #include <stdint.h>
19 #include <sys/queue.h>
20
21 /** Match type. */
22 enum rte_swx_table_match_type {
23         /** Wildcard Match (WM). */
24         RTE_SWX_TABLE_MATCH_WILDCARD,
25
26         /** Longest Prefix Match (LPM). */
27         RTE_SWX_TABLE_MATCH_LPM,
28
29         /** Exact Match (EM). */
30         RTE_SWX_TABLE_MATCH_EXACT,
31 };
32
33 /** Table creation parameters. */
34 struct rte_swx_table_params {
35         /** Table match type. */
36         enum rte_swx_table_match_type match_type;
37
38         /** Key size in bytes. */
39         uint32_t key_size;
40
41         /** Offset of the first byte of the key within the key buffer. */
42         uint32_t key_offset;
43
44         /** Mask of *key_size* bytes logically laid over the bytes at positions
45          * *key_offset* .. (*key_offset* + *key_size* - 1) of the key buffer in
46          * order to specify which bits from the key buffer are part of the key
47          * and which ones are not. A bit value of 1 in the *key_mask0* means the
48          * respective bit in the key buffer is part of the key, while a bit
49          * value of 0 means the opposite. A NULL value means that all the bits
50          * are part of the key, i.e. the *key_mask0* is an all-ones mask.
51          */
52         uint8_t *key_mask0;
53
54         /** Maximum size (in bytes) of the action data. The data stored in the
55          * table for each entry is equal to *action_data_size* plus 8 bytes,
56          * which are used to store the action ID.
57          */
58         uint32_t action_data_size;
59
60         /** Maximum number of keys to be stored in the table together with their
61          * associated data.
62          */
63         uint32_t n_keys_max;
64 };
65
66 /** Table entry. */
67 struct rte_swx_table_entry {
68         /** Used to facilitate the membership of this table entry to a
69          * linked list.
70          */
71         TAILQ_ENTRY(rte_swx_table_entry) node;
72
73         /** Key value for the current entry. Array of *key_size* bytes or NULL
74          * if the *key_size* for the current table is 0.
75          */
76         uint8_t *key;
77
78         /** Key mask for the current entry. Array of *key_size* bytes that is
79          * logically and'ed with *key_mask0* of the current table. A NULL value
80          * means that all the key bits already enabled by *key_mask0* are part
81          * of the key of the current entry.
82          */
83         uint8_t *key_mask;
84
85         /** Placeholder for a possible compressed version of the *key* and
86          * *key_mask* of the current entry. Typically a hash signature, its main
87          * purpose is to the linked list search operation. Should be ignored by
88          * the API functions below.
89          */
90         uint64_t key_signature;
91
92         /** Key priority for the current entry. Useful for wildcard match (as
93          * match rules are commonly overlapping with other rules), ignored for
94          * exact match (as match rules never overlap, hence all rules have the
95          * same match priority) and for LPM (match priority is driven by the
96          * prefix length, with non-overlapping prefixes essentially having the
97          * same match priority). Value 0 indicates the highest match priority.
98          */
99         uint32_t key_priority;
100
101         /** Action ID for the current entry. */
102         uint64_t action_id;
103
104         /** Action data for the current entry. Its size is defined by the action
105          * specified by the *action_id*. It must be NULL when the action data
106          * size of the *action_id* action is NULL. It must never exceed the
107          * *action_data_size* of the table.
108          */
109         uint8_t *action_data;
110 };
111
112 /** List of table entries. */
113 TAILQ_HEAD(rte_swx_table_entry_list, rte_swx_table_entry);
114
115 /**
116  * Table memory footprint get
117  *
118  * @param[in] params
119  *   Table create parameters.
120  * @param[in] entries
121  *   Table entries.
122  * @param[in] args
123  *   Any additional table create arguments. It may be NULL.
124  * @return
125  *   Table memory footprint in bytes, if successful, or zero, on error.
126  */
127 typedef uint64_t
128 (*rte_swx_table_footprint_get_t)(struct rte_swx_table_params *params,
129                                  struct rte_swx_table_entry_list *entries,
130                                  const char *args);
131
132 /**
133  * Table mailbox size get
134  *
135  * The mailbox is used to store the context of a lookup operation that is in
136  * progress and it is passed as a parameter to the lookup operation. This allows
137  * for multiple concurrent lookup operations into the same table.
138  *
139  * @return
140  *   Table memory footprint in bytes, on success, or zero, on error.
141  */
142 typedef uint64_t
143 (*rte_swx_table_mailbox_size_get_t)(void);
144
145 /**
146  * Table create
147  *
148  * @param[in] params
149  *   Table creation parameters.
150  * @param[in] entries
151  *   Entries to be added to the table at creation time.
152  * @param[in] args
153  *   Any additional table create arguments. It may be NULL.
154  * @param[in] numa_node
155  *   Non-Uniform Memory Access (NUMA) node.
156  * @return
157  *   Table handle, on success, or NULL, on error.
158  */
159 typedef void *
160 (*rte_swx_table_create_t)(struct rte_swx_table_params *params,
161                           struct rte_swx_table_entry_list *entries,
162                           const char *args,
163                           int numa_node);
164
165 /**
166  * Table entry add
167  *
168  * @param[in] table
169  *   Table handle.
170  * @param[in] entry
171  *   Entry to be added to the table.
172  * @return
173  *   0 on success or the following error codes otherwise:
174  *   -EINVAL: Invalid table handle, entry or entry field;
175  *   -ENOSPC: Table full.
176  */
177 typedef int
178 (*rte_swx_table_add_t)(void *table,
179                        struct rte_swx_table_entry *entry);
180
181 /**
182  * Table entry delete
183  *
184  * @param[in] table
185  *   Table handle.
186  * @param[in] entry
187  *   Entry to be deleted from the table. The entry *action_id* and *action_data*
188  *   fields are ignored.
189  * @return
190  *   0 on success or the following error codes otherwise:
191  *   -EINVAL: Invalid table handle, entry or entry field;
192  *   -ENOSPC: Table full.
193  */
194 typedef int
195 (*rte_swx_table_delete_t)(void *table,
196                           struct rte_swx_table_entry *entry);
197
198 /**
199  * Table lookup
200  *
201  * The table lookup operation searches a given key in the table and upon its
202  * completion it returns an indication of whether the key is found in the table
203  * (lookup hit) or not (lookup miss). In case of lookup hit, the action_id and
204  * the action_data associated with the key are also returned.
205  *
206  * Multiple invocations of this function may be required in order to complete a
207  * single table lookup operation for a given table and a given lookup key. The
208  * completion of the table lookup operation is flagged by a return value of 1;
209  * in case of a return value of 0, the function must be invoked again with
210  * exactly the same arguments.
211  *
212  * The mailbox argument is used to store the context of an on-going table lookup
213  * operation. The mailbox mechanism allows for multiple concurrent table lookup
214  * operations into the same table.
215  *
216  * The typical reason an implementation may choose to split the table lookup
217  * operation into multiple steps is to hide the latency of the inherrent memory
218  * read operations: before a read operation with the source data likely not in
219  * the CPU cache, the source data prefetch is issued and the table lookup
220  * operation is postponed in favor of some other unrelated work, which the CPU
221  * executes in parallel with the source data being fetched into the CPU cache;
222  * later on, the table lookup operation is resumed, this time with the source
223  * data likely to be read from the CPU cache with no CPU pipeline stall, which
224  * significantly improves the table lookup performance.
225  *
226  * @param[in] table
227  *   Table handle.
228  * @param[in] mailbox
229  *   Mailbox for the current table lookup operation.
230  * @param[in] key
231  *   Lookup key. Its size mult be equal to the table *key_size*. If the latter
232  *   is zero, then the lookup key must be NULL.
233  * @param[out] action_id
234  *   ID of the action associated with the *key*. Must point to a valid 64-bit
235  *   variable. Only valid when the function returns 1 and *hit* is set to true.
236  * @param[out] action_data
237  *   Action data for the *action_id* action. Must point to a valid array of
238  *   table *action_data_size* bytes. Only valid when the function returns 1 and
239  *   *hit* is set to true.
240  * @param[out] hit
241  *   Only valid when the function returns 1. Set to non-zero (true) on table
242  *   lookup hit and to zero (false) on table lookup miss.
243  * @return
244  *   0 when the table lookup operation is not yet completed, and 1 when the
245  *   table lookup operation is completed. No other return values are allowed.
246  */
247 typedef int
248 (*rte_swx_table_lookup_t)(void *table,
249                           void *mailbox,
250                           uint8_t **key,
251                           uint64_t *action_id,
252                           uint8_t **action_data,
253                           int *hit);
254
255 /**
256  * Table free
257  *
258  * @param[in] table
259  *   Table handle.
260  */
261 typedef void
262 (*rte_swx_table_free_t)(void *table);
263
264 /** Table operations.  */
265 struct rte_swx_table_ops {
266         /** Table memory footprint get. Set to NULL when not supported. */
267         rte_swx_table_footprint_get_t footprint_get;
268
269         /** Table mailbox size get. When NULL, the mailbox size is 0. */
270         rte_swx_table_mailbox_size_get_t mailbox_size_get;
271
272         /** Table create. Must be non-NULL. */
273         rte_swx_table_create_t create;
274
275         /** Incremental table entry add. Set to NULL when not supported, in
276          * which case the existing table has to be destroyed and a new table
277          * built from scratch with the new entry included.
278          */
279         rte_swx_table_add_t add;
280
281         /** Incremental table entry delete. Set to NULL when not supported, in
282          * which case the existing table has to be destroyed and a new table
283          * built from scratch with the entry excluded.
284          */
285         rte_swx_table_delete_t del;
286
287         /** Table lookup. Must be non-NULL. */
288         rte_swx_table_lookup_t lkp;
289
290         /** Table free. Must be non-NULL. */
291         rte_swx_table_free_t free;
292 };
293
294 #ifdef __cplusplus
295 }
296 #endif
297
298 #endif