NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
flow_pipes_manager.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2024 NVIDIA CORPORATION AND AFFILIATES. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification, are permitted
5  * provided that the following conditions are met:
6  * * Redistributions of source code must retain the above copyright notice, this list of
7  * conditions and the following disclaimer.
8  * * Redistributions in binary form must reproduce the above copyright notice, this list of
9  * conditions and the following disclaimer in the documentation and/or other materials
10  * provided with the distribution.
11  * * Neither the name of the NVIDIA CORPORATION nor the names of its contributors may be used
12  * to endorse or promote products derived from this software without specific prior written
13  * permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
21  * STRICT LIABILITY, OR TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  */
25 
26 #include <rte_errno.h>
27 #include <rte_hash.h>
28 #include <rte_jhash.h>
29 #include <rte_malloc.h>
30 
31 #include <doca_log.h>
32 #include <doca_error.h>
33 
34 #include "flow_pipes_manager.h"
35 
36 #define FNV_OFFSET 0xcbf29ce484222325 /* FNV-1a offset basis */
37 #define FNV_PRIME 0x100000001b3 /* FNV-1a prime */
38 #define DEFAULT_ENTRIES_NUM 128 /* entry table init size */
39 
40 DOCA_LOG_REGISTER(FLOW_PIPES_MANAGER);
41 
42 /*
43  * FNV-1a hash algorithm for pointer to id mapping
44  *
45  * @ptr [in]: Flow to send
46  * @return: Pointer to the allocated ID
47  */
48 static uint64_t *generateID(void *ptr)
49 {
50  uint64_t id = FNV_OFFSET;
51  const unsigned char *byte = (const unsigned char *)ptr;
52  uint64_t *id_ptr;
53  uint8_t bytes_num = sizeof(ptr);
54 
55  id_ptr = (uint64_t *)rte_malloc(NULL, sizeof(uint64_t), 0);
56 
57  while (bytes_num--)
58  id = (uint64_t)((*byte++) ^ id) * FNV_PRIME;
59 
60  *id_ptr = id;
61  return id_ptr;
62 }
63 
64 /*
65  * Create pipe information structure
66  *
67  * @pipe [in]: DOCA Flow pipe pointer
68  * @pipes_table [in]: Pipes table of the relevant port on which the pipe was created
69  * @return: Pointer to the allocated pipe info structure
70  */
71 static struct pipe_info *create_pipe_info(struct doca_flow_pipe *pipe, struct rte_hash *pipes_table)
72 {
73  struct pipe_info *pipe_info;
74  struct rte_hash_parameters table_params = {.name = "Entries Table",
75  .entries = DEFAULT_ENTRIES_NUM,
76  .key_len = sizeof(uint64_t),
77  .hash_func = rte_jhash,
78  .hash_func_init_val = 0};
79 
80  pipe_info = (struct pipe_info *)rte_malloc(NULL, sizeof(struct pipe_info), 0);
81  if (pipe_info == NULL) {
82  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager pipe_info structure");
83  return NULL;
84  }
85 
86  pipe_info->pipe = pipe;
87  pipe_info->port_id_to_pipes_table = pipes_table;
88  pipe_info->entries_table = rte_hash_create(&table_params);
89  if (pipe_info->entries_table == NULL) {
90  rte_free(pipe_info);
91  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager entries");
92  return NULL;
93  }
94 
95  return pipe_info;
96 }
97 
98 /*
99  * Destroy pipe information structure
100  *
101  * @pipe_info [in]: Pipe information structure to destroy
102  */
104 {
105  rte_hash_free(pipe_info->entries_table);
106  rte_free(pipe_info);
107 }
108 
110 {
111  struct rte_hash_parameters table_params = {.name = "Pipe id to Pipe info Entries",
112  .entries = DEFAULT_ENTRIES_NUM,
113  .key_len = sizeof(uint64_t),
114  .hash_func = rte_jhash,
115  .hash_func_init_val = 0};
116 
117  *pipes_manager = (struct flow_pipes_manager *)rte_malloc(NULL, sizeof(struct flow_pipes_manager), 0);
118  if (*pipes_manager == NULL) {
119  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager - %s", rte_strerror(rte_errno));
120  return DOCA_ERROR_NO_MEMORY;
121  }
122 
123  (*pipes_manager)->pipe_id_to_pipe_info_table = rte_hash_create(&table_params);
124  if ((*pipes_manager)->pipe_id_to_pipe_info_table == NULL) {
125  rte_free(*pipes_manager);
126  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager table - %s", rte_strerror(rte_errno));
127  return DOCA_ERROR_DRIVER;
128  }
129 
130  table_params.name = "Entry id to Pipe id Table";
131 
132  (*pipes_manager)->entry_id_to_pipe_id_table = rte_hash_create(&table_params);
133  if ((*pipes_manager)->entry_id_to_pipe_id_table == NULL) {
134  rte_hash_free((*pipes_manager)->pipe_id_to_pipe_info_table);
135  rte_free(*pipes_manager);
136  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager table - %s", rte_strerror(rte_errno));
137  return DOCA_ERROR_DRIVER;
138  }
139 
140  table_params.name = "Port id to Pipe Entries Table";
146  table_params.key_len = sizeof(uint32_t);
147 
148  (*pipes_manager)->port_id_to_pipes_id_table = rte_hash_create(&table_params);
149  if ((*pipes_manager)->port_id_to_pipes_id_table == NULL) {
150  rte_hash_free((*pipes_manager)->pipe_id_to_pipe_info_table);
151  rte_hash_free((*pipes_manager)->entry_id_to_pipe_id_table);
152  rte_free(*pipes_manager);
153  DOCA_LOG_ERR("Failed to allocate memory for Flow Pipes Manager table - %s", rte_strerror(rte_errno));
154  return DOCA_ERROR_DRIVER;
155  }
156 
157  return DOCA_SUCCESS;
158 }
159 
161 {
162  struct rte_hash *pipes_table;
163  struct doca_flow_pipe_entry *entry;
164  struct pipe_info *pipe_info;
165  uint64_t *pipe_id, *generated_entry_id;
166  uint32_t pipe_itr = 0, entry_itr;
167  uint32_t *port_id;
168 
169  while (rte_hash_iterate(manager->pipe_id_to_pipe_info_table,
170  (const void **)&pipe_id,
171  (void **)&pipe_info,
172  &pipe_itr) >= 0) {
173  entry_itr = 0;
174  while (rte_hash_iterate(pipe_info->entries_table,
175  (const void **)&generated_entry_id,
176  (void **)&entry,
177  &entry_itr) >= 0)
178  rte_free(generated_entry_id);
179 
180  rte_free(pipe_id);
182  }
183 
184  pipe_itr = 0;
185  while (rte_hash_iterate(manager->port_id_to_pipes_id_table,
186  (const void **)&port_id,
187  (void **)&pipes_table,
188  &pipe_itr) >= 0)
189  rte_hash_free(pipes_table);
190 
191  rte_hash_free(manager->port_id_to_pipes_id_table);
192  rte_hash_free(manager->entry_id_to_pipe_id_table);
193  rte_hash_free(manager->pipe_id_to_pipe_info_table);
194  rte_free(manager);
195 }
196 
198  struct doca_flow_pipe *pipe,
199  uint16_t port_id,
200  uint64_t *pipe_id)
201 {
202  struct pipe_info *pipe_info;
203  struct rte_hash *pipes_table;
204  struct rte_hash_parameters table_params = {.name = "Pipe id's only",
205  .entries = DEFAULT_ENTRIES_NUM,
206  .key_len = sizeof(uint64_t),
207  .hash_func = rte_jhash,
208  .hash_func_init_val = 0};
209  uint64_t *generated_pipe_id;
214  uint32_t temp_port_id = (uint32_t)port_id;
215  uint32_t *port_id_key;
216  int32_t result;
217  bool is_new_table = false;
218 
219  generated_pipe_id = generateID(pipe);
220  if (rte_hash_lookup(manager->pipe_id_to_pipe_info_table, (const void *)generated_pipe_id) >= 0) {
221  DOCA_LOG_ERR("Could not add new pipe with id=%" PRIu64 ", id already exists", *generated_pipe_id);
223  }
224 
225  result = rte_hash_lookup_data(manager->port_id_to_pipes_id_table,
226  (const void *)&temp_port_id,
227  (void **)&pipes_table);
228  if (result < 0) {
229  is_new_table = true;
230 
231  /* allocate new port id key */
232  port_id_key = (uint32_t *)rte_malloc(NULL, sizeof(uint32_t), 0);
233  *port_id_key = temp_port_id;
234 
235  pipes_table = rte_hash_create(&table_params);
236  if (pipes_table == NULL) {
237  DOCA_LOG_ERR("Could not create new pipes table for pipe with id=%" PRIu64 "",
238  *generated_pipe_id);
239  rte_free(port_id_key);
240  rte_free(generated_pipe_id);
241  return DOCA_ERROR_NO_MEMORY;
242  }
243 
244  result = rte_hash_add_key(pipes_table, (const void *)generated_pipe_id);
245  if (result < 0) {
246  DOCA_LOG_ERR("Could not add new pipe with id=%" PRIu64 ", to relevant pipes table",
247  *generated_pipe_id);
248  rte_hash_free(pipes_table);
249  rte_free(port_id_key);
250  rte_free(generated_pipe_id);
252  }
253 
254  result = rte_hash_add_key_data(manager->port_id_to_pipes_id_table,
255  (const void *)port_id_key,
256  (void *)pipes_table);
257  if (result != 0) {
258  DOCA_LOG_ERR("Could not add new pipes table to port to pipes table");
259  rte_hash_del_key(pipes_table, (const void *)generated_pipe_id);
260  rte_hash_free(pipes_table);
261  rte_free(port_id_key);
263  }
264 
265  } else {
266  result = rte_hash_add_key(pipes_table, (const void *)generated_pipe_id);
267  if (result < 0) {
268  DOCA_LOG_ERR("Could not add new pipe id=%" PRIu64 " to relevant pipes table",
269  *generated_pipe_id);
270  rte_free(generated_pipe_id);
272  }
273  }
274 
275  pipe_info = create_pipe_info(pipe, pipes_table);
276  if (pipe_info == NULL) {
277  DOCA_LOG_ERR("Could not add new pipe id=%" PRIu64 " to relevant pipe_info", *generated_pipe_id);
278  rte_hash_del_key(pipes_table, (const void *)generated_pipe_id);
279  if (is_new_table) {
280  rte_hash_del_key(manager->port_id_to_pipes_id_table, (const void *)port_id_key);
281  rte_hash_free(pipes_table);
282  }
283  return DOCA_ERROR_NO_MEMORY;
284  }
285 
286  result = rte_hash_add_key_data(manager->pipe_id_to_pipe_info_table,
287  (const void *)generated_pipe_id,
288  (void *)pipe_info);
289  if (result != 0) {
290  DOCA_LOG_ERR("Could not add new pipe_info with pipe id=%" PRIu64 " to relevant pipe info table",
291  *generated_pipe_id);
292  rte_hash_del_key(pipes_table, (const void *)generated_pipe_id);
294  if (is_new_table) {
295  rte_hash_del_key(manager->port_id_to_pipes_id_table, (const void *)port_id_key);
296  rte_hash_free(pipes_table);
297  }
299  }
300 
301  *pipe_id = *generated_pipe_id;
302 
303  return DOCA_SUCCESS;
304 }
305 
307  struct doca_flow_pipe_entry *entry,
308  uint64_t pipe_id,
309  uint64_t *entry_id)
310 {
311  uint64_t *generated_entry_id, *pipe_id_ptr;
312  struct pipe_info *pipe_info;
313  struct rte_hash *entries_table;
314  int result;
315 
316  generated_entry_id = generateID(entry);
317 
318  result = rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table, (const void *)&pipe_id, (void **)&pipe_info);
319  if (result < 0) {
320  DOCA_LOG_ERR("Could not find relevant pipe id, entry was not entered");
322  }
323 
324  if (rte_hash_get_key_with_position(manager->pipe_id_to_pipe_info_table, result, (void **)&pipe_id_ptr) != 0) {
325  DOCA_LOG_ERR("Could not find relevant pipe id, entry was not entered");
326  return DOCA_ERROR_NOT_FOUND;
327  }
328 
329  entries_table = pipe_info->entries_table;
330 
331  if (rte_hash_lookup(entries_table, (const void *)&generated_entry_id) >= 0) {
332  DOCA_LOG_ERR("Could not add new entry with id=%" PRIu64 ", id already exists", *generated_entry_id);
334  }
335 
336  result = rte_hash_add_key_data(entries_table, (const void *)generated_entry_id, (void *)entry);
337  if (result != 0) {
338  DOCA_LOG_ERR("Could not add new entry with id=%" PRIu64 ", to relevant entries table",
339  *generated_entry_id);
340  rte_free(generated_entry_id);
342  }
343 
344  result = rte_hash_add_key_data(manager->entry_id_to_pipe_id_table,
345  (const void *)generated_entry_id,
346  (void *)pipe_id_ptr);
347  if (result != 0) {
348  DOCA_LOG_ERR("Could not add new entry with id=%" PRIu64 ", to entry-to-pipe table",
349  *generated_entry_id);
350  rte_hash_del_key(entries_table, (const void *)generated_entry_id);
352  }
353 
354  *entry_id = *generated_entry_id;
355 
356  return DOCA_SUCCESS;
357 }
358 
359 doca_error_t pipes_manager_get_pipe(struct flow_pipes_manager *manager, uint64_t pipe_id, struct doca_flow_pipe **pipe)
360 {
361  struct pipe_info *pipe_info;
362 
363  if (rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table, (const void *)&pipe_id, (void **)&pipe_info) < 0)
364  return DOCA_ERROR_NOT_FOUND;
365 
366  *pipe = pipe_info->pipe;
367 
368  return DOCA_SUCCESS;
369 }
370 
372  uint64_t entry_id,
373  struct doca_flow_pipe_entry **entry)
374 {
375  struct pipe_info *pipe_info;
376  struct doca_flow_pipe_entry *pipe_entry;
377  uint64_t *pipe_id;
378 
379  if (rte_hash_lookup_data(manager->entry_id_to_pipe_id_table, (const void *)&entry_id, (void **)&pipe_id) < 0)
380  return DOCA_ERROR_NOT_FOUND;
381 
382  if (rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table, (const void *)pipe_id, (void **)&pipe_info) < 0)
383  return DOCA_ERROR_NOT_FOUND;
384 
385  if (rte_hash_lookup_data(pipe_info->entries_table, (const void *)&entry_id, (void **)&pipe_entry) < 0)
386  return DOCA_ERROR_NOT_FOUND;
387 
388  *entry = pipe_entry;
389 
390  return DOCA_SUCCESS;
391 }
392 
394 {
395  struct pipe_info *pipe_info;
396  struct doca_flow_pipe_entry *entry, *pipe_id_key;
397  uint64_t *generated_entry_id;
398  uint32_t itr = 0;
399  int key_offset;
400 
401  key_offset =
402  rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table, (const void *)&pipe_id, (void *)&pipe_info);
403  if (key_offset < 0) {
404  DOCA_LOG_ERR("Could not remove pipe with id=%" PRIu64 ", id was not found", pipe_id);
406  }
407 
408  if (rte_hash_get_key_with_position(manager->pipe_id_to_pipe_info_table, key_offset, (void **)&pipe_id_key) !=
409  0) {
410  DOCA_LOG_ERR("Could not remove pipe with id=%" PRIu64 ", id was not found", pipe_id);
411  return DOCA_ERROR_NOT_FOUND;
412  }
413 
414  /* remove it directly from relevant port id to pipes table */
415  if (rte_hash_del_key(pipe_info->port_id_to_pipes_table, (const void *)&pipe_id) < 0) {
416  DOCA_LOG_ERR("Could not remove pipe with id=%" PRIu64 "", pipe_id);
417  return DOCA_ERROR_NOT_FOUND;
418  }
419 
420  while (rte_hash_iterate(pipe_info->entries_table, (const void **)&generated_entry_id, (void **)&entry, &itr) >=
421  0)
422  rte_hash_del_key(manager->entry_id_to_pipe_id_table, (const void *)generated_entry_id);
423 
424  rte_hash_del_key(manager->pipe_id_to_pipe_info_table, (const void *)&pipe_id);
426 
427  DOCA_LOG_INFO("Pipe with id %" PRIu64 " removed successfully", pipe_id);
428 
429  return DOCA_SUCCESS;
430 }
431 
433 {
434  struct pipe_info *pipe_info;
435  uint64_t *pipe_id, *entry_id_key;
436  int key_offset;
437 
438  key_offset =
439  rte_hash_lookup_data(manager->entry_id_to_pipe_id_table, (const void *)&entry_id, (void **)&pipe_id);
440  if (key_offset < 0) {
441  DOCA_LOG_ERR("Could not remove entry with id=%" PRIu64 ", id was not found", entry_id);
443  }
444 
445  if (rte_hash_get_key_with_position(manager->entry_id_to_pipe_id_table, key_offset, (void **)&entry_id_key) !=
446  0) {
447  DOCA_LOG_ERR("Could not remove entry with id=%" PRIu64 ", id was not found", entry_id);
448  return DOCA_ERROR_NOT_FOUND;
449  }
450 
451  if (rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table, (const void *)pipe_id, (void **)&pipe_info) < 0) {
452  DOCA_LOG_ERR("Could not remove entry with id=%" PRIu64 ", relevant pipe id was not found", entry_id);
454  }
455 
456  if (rte_hash_del_key(manager->entry_id_to_pipe_id_table, (const void *)&entry_id) < 0) {
457  DOCA_LOG_ERR("Could not remove entry with id=%" PRIu64 ", id was not found", entry_id);
458  return DOCA_ERROR_NOT_FOUND;
459  }
460 
461  if (rte_hash_del_key(pipe_info->entries_table, (const void *)&entry_id) < 0) {
462  DOCA_LOG_ERR("Could not remove entry with id=%" PRIu64 ", id was not found", entry_id);
463  return DOCA_ERROR_NOT_FOUND;
464  }
465 
466  DOCA_LOG_INFO("Entry with id=%" PRIu64 " removed successfully", entry_id);
467 
468  return DOCA_SUCCESS;
469 }
470 
472 {
473  struct rte_hash *pipes_table;
474  struct pipe_info *pipe_info;
475  uint64_t *pipe_id, *generated_entry_id, *data;
476  uint32_t pipe_itr = 0;
477  uint32_t entry_itr;
482  uint32_t temp_port_id = (uint32_t)port_id;
483  uint32_t *port_id_key;
484  int key_offset;
485  int result;
486 
487  key_offset = rte_hash_lookup_data(manager->port_id_to_pipes_id_table,
488  (const void *)&temp_port_id,
489  (void **)&pipes_table);
490 
491  if (key_offset < 0) {
492  DOCA_LOG_ERR("Could not find port with id=%" PRIu16 ", aborting flush", port_id);
494  }
495 
496  if (rte_hash_get_key_with_position(manager->port_id_to_pipes_id_table, key_offset, (void **)&port_id_key) !=
497  0) {
498  DOCA_LOG_ERR("Could not find port with id=%" PRIu16 ", aborting flush", port_id);
499  return DOCA_ERROR_NOT_FOUND;
500  }
501 
502  while (rte_hash_iterate(pipes_table, (const void **)&pipe_id, (void **)&data, &pipe_itr) >= 0) {
503  result = rte_hash_lookup_data(manager->pipe_id_to_pipe_info_table,
504  (const void *)pipe_id,
505  (void **)&pipe_info);
506  if (result < 0) {
507  DOCA_LOG_ERR("Could not find pipe id pipe_info with id=%" PRIu64 ", aborting flush", *pipe_id);
508  continue;
509  }
510 
511  entry_itr = 0;
512  while (rte_hash_iterate(pipe_info->entries_table,
513  (const void **)&generated_entry_id,
514  (void **)&data,
515  &entry_itr) >= 0)
516  rte_hash_del_key(manager->entry_id_to_pipe_id_table, (const void *)generated_entry_id);
517 
519  rte_hash_del_key(manager->pipe_id_to_pipe_info_table, (const void *)pipe_id);
520  }
521 
522  rte_hash_free(pipes_table);
523  rte_hash_del_key(manager->port_id_to_pipes_id_table, (const void **)&temp_port_id);
524 
525  return DOCA_SUCCESS;
526 }
#define NULL
Definition: __stddef_null.h:26
int32_t result
static struct doca_flow_pipe_entry * entry[MAX_ENTRIES]
doca_error_t pipes_manager_pipe_add_entry(struct flow_pipes_manager *manager, struct doca_flow_pipe_entry *entry, uint64_t pipe_id, uint64_t *entry_id)
doca_error_t pipes_manager_pipe_destroy(struct flow_pipes_manager *manager, uint64_t pipe_id)
doca_error_t pipes_manager_get_pipe(struct flow_pipes_manager *manager, uint64_t pipe_id, struct doca_flow_pipe **pipe)
doca_error_t create_pipes_manager(struct flow_pipes_manager **pipes_manager)
#define FNV_OFFSET
static uint64_t * generateID(void *ptr)
static struct pipe_info * create_pipe_info(struct doca_flow_pipe *pipe, struct rte_hash *pipes_table)
void destroy_pipes_manager(struct flow_pipes_manager *manager)
doca_error_t pipes_manager_pipe_create(struct flow_pipes_manager *manager, struct doca_flow_pipe *pipe, uint16_t port_id, uint64_t *pipe_id)
static void destroy_pipe_info(struct pipe_info *pipe_info)
#define DEFAULT_ENTRIES_NUM
DOCA_LOG_REGISTER(FLOW_PIPES_MANAGER)
doca_error_t pipes_manager_get_entry(struct flow_pipes_manager *manager, uint64_t entry_id, struct doca_flow_pipe_entry **entry)
#define FNV_PRIME
doca_error_t pipes_manager_pipe_rm_entry(struct flow_pipes_manager *manager, uint64_t entry_id)
doca_error_t pipes_manager_pipes_flush(struct flow_pipes_manager *manager, uint16_t port_id)
enum doca_error doca_error_t
DOCA API return codes.
@ DOCA_ERROR_INVALID_VALUE
Definition: doca_error.h:44
@ DOCA_ERROR_NOT_FOUND
Definition: doca_error.h:54
@ DOCA_SUCCESS
Definition: doca_error.h:38
@ DOCA_ERROR_NO_MEMORY
Definition: doca_error.h:45
@ DOCA_ERROR_DRIVER
Definition: doca_error.h:59
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
Definition: doca_log.h:466
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
Definition: doca_log.h:486
struct rte_hash * pipe_id_to_pipe_info_table
struct rte_hash * port_id_to_pipes_id_table
struct rte_hash * entry_id_to_pipe_id_table
struct rte_hash * port_id_to_pipes_table
struct rte_hash * entries_table
struct doca_flow_pipe * pipe
static struct flow_pipes_manager * pipes_manager
Definition: switch_core.c:41