NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
doca_utils.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 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 
27 
28 #include <array>
29 #include <stdexcept>
30 #include <thread>
31 
32 #include <doca_error.h>
33 #include <doca_log.h>
34 
36 
37 DOCA_LOG_REGISTER(DOCA_UTILS);
38 
39 using namespace std::string_literals;
40 
41 namespace storage {
42 
43 doca_dev *open_device(std::string const &identifier)
44 {
45  static auto constexpr pci_addr_len = sizeof("XX:XX.X") - sizeof('\0');
46  static auto constexpr pci_long_addr_len = sizeof("XXXX:XX:XX.X") - sizeof('\0');
47  static auto constexpr max_name_length = std::max(DOCA_DEVINFO_IFACE_NAME_SIZE, IB_DEVICE_NAME_MAX);
48 
49  doca_error_t ret;
50  doca_devinfo **list = nullptr;
51  uint32_t list_size = 0;
52  ret = doca_devinfo_create_list(&list, &list_size);
53  if (ret != DOCA_SUCCESS) {
54  throw std::runtime_error{"Unable to enumerate doca devices: "s + doca_error_get_name(ret)};
55  }
56 
57  doca_devinfo *selected_devinfo = nullptr;
58 
59  for (uint32_t ii = 0; ii != list_size; ++ii) {
60  auto *devinfo = list[ii];
61  std::array<char, max_name_length> device_name;
62 
63  if (identifier.size() == pci_addr_len || identifier.size() == pci_long_addr_len) {
64  uint8_t is_addr_equal = 0;
65  ret = doca_devinfo_is_equal_pci_addr(devinfo, identifier.c_str(), &is_addr_equal);
66  if (ret == DOCA_SUCCESS && is_addr_equal) {
67  selected_devinfo = devinfo;
68  break;
69  }
70  }
71 
72  ret = doca_devinfo_get_ibdev_name(devinfo, device_name.data(), device_name.size());
73  if (ret == DOCA_SUCCESS) {
74  if (strcmp(identifier.c_str(), device_name.data()) == 0) {
75  selected_devinfo = devinfo;
76  break;
77  }
78  }
79 
80  ret = doca_devinfo_get_iface_name(devinfo, device_name.data(), device_name.size());
81  if (ret == DOCA_SUCCESS) {
82  if (strcmp(identifier.c_str(), device_name.data()) == 0) {
83  selected_devinfo = devinfo;
84  break;
85  }
86  }
87  };
88 
89  if (selected_devinfo == nullptr) {
90  static_cast<void>(doca_devinfo_destroy_list(list));
91  throw std::runtime_error{"No doca device found that matched given identifier: \"" + identifier + "\""};
92  }
93 
94  doca_dev *opened_device;
95  ret = doca_dev_open(selected_devinfo, &opened_device);
96  static_cast<void>(doca_devinfo_destroy_list(list));
97  if (ret != DOCA_SUCCESS) {
98  throw std::runtime_error{"Failed to open doca device"s + doca_error_get_name(ret)};
99  }
100 
101  return opened_device;
102 }
103 
104 doca_dev_rep *open_representor(doca_dev *dev, std::string const &identifier)
105 {
106  doca_error_t ret;
107  doca_devinfo_rep **list = nullptr;
108  uint32_t list_size = 0;
109 
110  uint8_t supports_net_filter = 0;
111  ret = doca_devinfo_rep_cap_is_filter_net_supported(doca_dev_as_devinfo(dev), &supports_net_filter);
112  if (ret != DOCA_SUCCESS || supports_net_filter == 0)
113  throw std::runtime_error{"Selected doca device does not support representors"s +
114  doca_error_get_name(ret)};
115 
116  ret = doca_devinfo_rep_create_list(dev, DOCA_DEVINFO_REP_FILTER_NET, &list, &list_size);
117  if (ret != DOCA_SUCCESS) {
118  throw std::runtime_error{"Unable to enumerate doca device representors"s + doca_error_get_name(ret)};
119  }
120 
121  for (uint32_t ii = 0; ii != list_size; ++ii) {
122  auto *repinfo = list[ii];
123  uint8_t is_addr_equal;
124 
125  ret = doca_devinfo_rep_is_equal_pci_addr(repinfo, identifier.c_str(), &is_addr_equal);
126  if (ret == DOCA_SUCCESS && is_addr_equal) {
127  doca_dev_rep *rep;
128 
129  ret = doca_dev_rep_open(repinfo, &rep);
130  if (ret != DOCA_SUCCESS) {
131  static_cast<void>(doca_devinfo_rep_destroy_list(list));
132  throw std::runtime_error{"Unable to open doca device representor"s +
133  doca_error_get_name(ret)};
134  }
135 
136  static_cast<void>(doca_devinfo_rep_destroy_list(list));
137  return rep;
138  }
139  }
140 
141  static_cast<void>(doca_devinfo_rep_destroy_list(list));
142  throw std::runtime_error{"No doca device representor found that matched given identifier: \"" + identifier +
143  "\""};
144 }
145 
146 doca_mmap *make_mmap(doca_dev *dev, char *memory_region, size_t memory_region_size, uint32_t permissions)
147 {
148  doca_error_t ret;
149  doca_mmap *obj = nullptr;
150  ret = doca_mmap_create(&obj);
151  if (ret != DOCA_SUCCESS) {
152  throw std::runtime_error{"Failed to create doca_mmap: "s + doca_error_get_name(ret)};
153  }
154  DOCA_LOG_DBG("Created mmap %p: dev: %p, region: %p, size: %lu, permissions: 0x%X",
155  obj,
156  dev,
157  memory_region,
158  memory_region_size,
159  permissions);
160 
161  ret = doca_mmap_add_dev(obj, dev);
162  if (ret != DOCA_SUCCESS) {
163  static_cast<void>(doca_mmap_destroy(obj));
164  throw std::runtime_error{"Failed to add doca_dev to doca_mmap: "s + doca_error_get_name(ret)};
165  }
166 
167  ret = doca_mmap_set_memrange(obj, memory_region, memory_region_size);
168  if (ret != DOCA_SUCCESS) {
169  static_cast<void>(doca_mmap_destroy(obj));
170  throw std::runtime_error{"Failed to set doca_mmap memory range: "s + doca_error_get_name(ret)};
171  }
172 
173  ret = doca_mmap_set_permissions(obj, permissions);
174  if (ret != DOCA_SUCCESS) {
175  static_cast<void>(doca_mmap_destroy(obj));
176  throw std::runtime_error{"Failed to set doca_mmap access permissions: "s + doca_error_get_name(ret)};
177  }
178 
179  ret = doca_mmap_start(obj);
180  if (ret != DOCA_SUCCESS) {
181  static_cast<void>(doca_mmap_destroy(obj));
182  throw std::runtime_error{"Failed to start doca_mmap: "s + doca_error_get_name(ret)};
183  }
184 
185  return obj;
186 }
187 
188 doca_mmap *make_mmap(doca_dev *dev, void const *mmap_export_blob, size_t mmap_export_blob_size)
189 {
190  doca_mmap *mmap = nullptr;
191  auto const ret = doca_mmap_create_from_export(nullptr, mmap_export_blob, mmap_export_blob_size, dev, &mmap);
192  if (ret != DOCA_SUCCESS) {
193  throw std::runtime_error{"Failed to create doca_mmap from export: "s + doca_error_get_name(ret)};
194  }
195 
196  DOCA_LOG_DBG("Created mmap from export: %p using: dev %p, blob %p, blob_size: %zu",
197  mmap,
198  dev,
199  mmap_export_blob,
200  mmap_export_blob_size);
201 
202  return mmap;
203 }
204 
205 doca_buf_inventory *make_buf_inventory(size_t num_elements)
206 {
207  doca_buf_inventory *inv;
208  doca_error_t ret;
209 
210  ret = doca_buf_inventory_create(num_elements, &inv);
211  if (ret != DOCA_SUCCESS) {
212  throw std::runtime_error{"Failed to create doca_buf_inventory: "s + doca_error_get_name(ret)};
213  }
214 
215  ret = doca_buf_inventory_start(inv);
216  if (ret != DOCA_SUCCESS) {
217  static_cast<void>(doca_buf_inventory_destroy(inv));
218  throw std::runtime_error{"Failed to start doca_buf_inventory: "s + doca_error_get_name(ret)};
219  }
220 
221  return inv;
222 }
223 
224 doca_comch_consumer *make_comch_consumer(doca_comch_connection *conn,
225  doca_mmap *mmap,
226  doca_pe *pe,
227  uint32_t task_pool_size,
228  doca_data callback_user_data,
231 {
232  doca_error_t ret;
233 
234  doca_comch_consumer *obj;
235  ret = doca_comch_consumer_create(conn, mmap, &obj);
236  if (ret != DOCA_SUCCESS) {
237  throw std::runtime_error{"Failed to create doca_comch_consumer: "s + doca_error_get_name(ret)};
238  }
239 
240  DOCA_LOG_TRC(
241  "Created consumer using; conn: %p, pe: %p, mmap: %p, task_pool_size: %u, callback_user_data: 0x%lX, task_cb: %p, error_cb: %p ",
242  conn,
243  pe,
244  mmap,
245  task_pool_size,
246  callback_user_data.u64,
247  task_cb,
248  error_cb);
249 
251  if (ret != DOCA_SUCCESS) {
252  static_cast<void>(doca_comch_consumer_destroy(obj));
253  throw std::runtime_error{"Failed to connect doca_comch_consumer to progress engine: "s +
254  doca_error_get_name(ret)};
255  }
256 
257  ret = doca_comch_consumer_task_post_recv_set_conf(obj, task_cb, error_cb, task_pool_size);
258  if (ret != DOCA_SUCCESS) {
259  static_cast<void>(doca_comch_consumer_destroy(obj));
260  throw std::runtime_error{"Failed to create doca_comch_consumer task pool: "s +
261  doca_error_get_name(ret)};
262  }
263 
264  ret = doca_ctx_set_user_data(doca_comch_consumer_as_ctx(obj), callback_user_data);
265  if (ret != DOCA_SUCCESS) {
266  static_cast<void>(doca_comch_consumer_destroy(obj));
267  throw std::runtime_error{"Failed to set doca_comch_consumer user data: "s + doca_error_get_name(ret)};
268  }
269 
271  if (ret != DOCA_ERROR_IN_PROGRESS) {
272  static_cast<void>(doca_comch_consumer_destroy(obj));
273  throw std::runtime_error{"Failed to start doca_comch_consumer: "s + doca_error_get_name(ret)};
274  }
275 
276  return obj;
277 }
278 
279 doca_comch_producer *make_comch_producer(doca_comch_connection *conn,
280  doca_pe *pe,
281  uint32_t task_pool_size,
282  doca_data callback_user_data,
285 {
286  doca_error_t ret;
287 
288  doca_comch_producer *obj;
289  ret = doca_comch_producer_create(conn, &obj);
290  if (ret != DOCA_SUCCESS) {
291  throw std::runtime_error{"Failed to create doca_comch_producer: "s + doca_error_get_name(ret)};
292  }
293  DOCA_LOG_TRC(
294  "Created producer using; conn: %p, pe: %p, task_pool_size: %u, callback_user_data: 0x%lX, task_cb: %p, error_cb: %p ",
295  conn,
296  pe,
297  task_pool_size,
298  callback_user_data.u64,
299  task_cb,
300  error_cb);
301 
303  if (ret != DOCA_SUCCESS) {
304  static_cast<void>(doca_comch_producer_destroy(obj));
305  throw std::runtime_error{"Failed to connect doca_comch_producer to progress engine: "s +
306  doca_error_get_name(ret)};
307  }
308 
309  ret = doca_comch_producer_task_send_set_conf(obj, task_cb, error_cb, task_pool_size);
310  if (ret != DOCA_SUCCESS) {
311  static_cast<void>(doca_comch_producer_destroy(obj));
312  throw std::runtime_error{"Failed to create doca_comch_producer task pool: "s +
313  doca_error_get_name(ret)};
314  }
315 
316  ret = doca_ctx_set_user_data(doca_comch_producer_as_ctx(obj), callback_user_data);
317  if (ret != DOCA_SUCCESS) {
318  static_cast<void>(doca_comch_producer_destroy(obj));
319  throw std::runtime_error{"Failed to set doca_comch_producer user data: "s + doca_error_get_name(ret)};
320  }
321 
323  if (ret != DOCA_SUCCESS) {
324  static_cast<void>(doca_comch_producer_destroy(obj));
325  throw std::runtime_error{"Failed to start doca_comch_producer: "s + doca_error_get_name(ret)};
326  }
327 
328  return obj;
329 }
330 
331 doca_rdma *make_rdma_context(doca_dev *dev, doca_pe *pe, doca_data ctx_user_data, uint32_t permissions)
332 {
333  doca_error_t ret;
334 
335  doca_rdma *rdma;
336  ret = doca_rdma_create(dev, &rdma);
337  if (ret != DOCA_SUCCESS) {
338  throw std::runtime_error{"Failed to create rdma instance: "s + doca_error_get_name(ret)};
339  }
340 
341  ret = doca_rdma_set_permissions(rdma, permissions);
342  if (ret != DOCA_SUCCESS) {
343  static_cast<void>(doca_rdma_destroy(rdma));
344  throw std::runtime_error{"Failed to set doca_rdma permissions: "s + doca_error_get_name(ret)};
345  }
346 
348  if (ret != DOCA_SUCCESS) {
349  static_cast<void>(doca_rdma_destroy(rdma));
350  throw std::runtime_error{"Failed to attach doca_rdma to doca_pe: "s + doca_error_get_name(ret)};
351  }
352 
353  ret = doca_ctx_set_user_data(doca_rdma_as_ctx(rdma), ctx_user_data);
354  if (ret != DOCA_SUCCESS) {
355  static_cast<void>(doca_rdma_destroy(rdma));
356  throw std::runtime_error{"Failed to set doca_rdma user data: "s + doca_error_get_name(ret)};
357  }
358 
359  return rdma;
360 }
361 
362 bool is_ctx_running(doca_ctx *ctx) noexcept
363 {
365  static_cast<void>(doca_ctx_get_state(ctx, &cur_state));
366  return cur_state == DOCA_CTX_STATE_RUNNING;
367 }
368 
369 doca_error_t stop_context(doca_ctx *ctx, doca_pe *pe) noexcept
370 {
371  std::vector<doca_task *> ctx_tasks;
372  return stop_context(ctx, pe, ctx_tasks);
373 }
374 
375 doca_error_t stop_context(doca_ctx *ctx, doca_pe *pe, std::vector<doca_task *> &ctx_tasks) noexcept
376 {
377  auto ret = doca_ctx_stop(ctx);
378  if (ret == DOCA_SUCCESS)
379  return DOCA_SUCCESS;
380 
381  if (ret != DOCA_ERROR_AGAIN && ret != DOCA_ERROR_IN_USE && ret != DOCA_ERROR_IN_PROGRESS)
382  return ret;
383 
384  /* Submitted tasks require the context to start stopping to flush them out (via the error callback) before they
385  * can be released, progress the context until all pending tasks have been completed.
386  */
387  if (!ctx_tasks.empty()) {
388  size_t num_inflight_tasks = 0;
389  do {
390  static_cast<void>(doca_ctx_get_num_inflight_tasks(ctx, &num_inflight_tasks));
391  for (size_t ii = 0; ii != num_inflight_tasks; ++ii)
392  static_cast<void>(doca_pe_progress(pe));
393  } while (num_inflight_tasks != 0);
394 
395  for (auto *task : ctx_tasks)
396  doca_task_free(task);
397  ctx_tasks.clear();
398  }
399 
400  /* In the case of having had in flight tasks the context may need more time to clean up after they have
401  * completed. Continue to progress the context until it returns to the idle state.
402  */
403  for (;;) {
404  static_cast<void>(doca_pe_progress(pe));
406  static_cast<void>(doca_ctx_get_state(ctx, &cur_state));
407  if (cur_state == DOCA_CTX_STATE_IDLE) {
408  return DOCA_SUCCESS;
409  }
410  }
411 }
412 
414  char const *short_name,
415  char const *long_name,
416  char const *description,
417  value_requirement requirement,
418  value_multiplicity multiplicity,
419  doca_argp_param_cb_t callback)
420 {
421  if (!short_name && !long_name) {
422  throw std::runtime_error{"Unable to register arg parser parameter with no name"};
423  }
424  doca_error_t ret;
425  doca_argp_param *param{nullptr};
426 
427  ret = doca_argp_param_create(&param);
428  if (ret != DOCA_SUCCESS) {
429  throw std::runtime_error{"Failed to create arg parser parameter"};
430  }
431 
432  if (short_name != nullptr) {
433  doca_argp_param_set_short_name(param, short_name);
434  }
435  if (long_name != nullptr) {
436  doca_argp_param_set_long_name(param, long_name);
437  }
439  doca_argp_param_set_callback(param, callback);
441  if (requirement.is_required) {
443  }
444  if (multiplicity.support_multiple_values) {
446  }
447 
448  ret = doca_argp_register_param(param);
449  if (ret != DOCA_SUCCESS) {
450  std::string message{"Unable to register arg parser parameter: "};
451  if (short_name) {
452  message += "-";
453  message += *short_name;
454  if (long_name) {
455  message += " aka ";
456  }
457  }
458 
459  if (long_name) {
460  message += "--";
461  message += long_name;
462  }
463 
464  message += " reason: ";
465  message += doca_error_get_descr(ret);
466 
467  throw std::runtime_error{message};
468  }
469 }
470 
471 void create_doca_logger_backend(void) noexcept
472 {
473  doca_error_t ret;
474 
475  doca_log_backend *stdout_logger = nullptr;
476 
477  /* Register a logger backend */
479  if (ret != DOCA_SUCCESS) {
480  printf("doca_log_backend_create_standard() failed: %s\n", doca_error_get_name(ret));
481  fflush(stdout);
482  fflush(stderr);
483  exit(EXIT_FAILURE);
484  }
485 
487  if (ret != DOCA_SUCCESS) {
488  printf("doca_log_backend_create_with_file_sdk() failed: %s\n", doca_error_get_name(ret));
489  fflush(stdout);
490  fflush(stderr);
491  exit(EXIT_FAILURE);
492  }
493 
495  if (ret != DOCA_SUCCESS) {
496  printf("doca_log_backend_set_sdk_level() failed: %s\n", doca_error_get_name(ret));
497  fflush(stdout);
498  fflush(stderr);
499  exit(EXIT_FAILURE);
500  }
501 }
502 
503 doca_ec_matrix_type matrix_type_from_string(std::string const &matrix_type)
504 {
505  if (matrix_type == "vandermonde") {
507  }
508 
509  if (matrix_type == "cauchy") {
511  }
512 
513  throw storage::runtime_error{DOCA_ERROR_INVALID_VALUE, "Unknown doca_ec matrix type: "s + matrix_type};
514 }
515 
516 } /* namespace storage */
doca_dpa_dev_mmap_t mmap
DOCA_LOG_REGISTER(DOCA_UTILS)
struct doca_log_backend * stdout_logger
static struct doca_pe * pe
DOCA_EXPERIMENTAL void doca_argp_param_set_description(struct doca_argp_param *param, const char *description)
Set the description of the program param, used during program usage.
DOCA_EXPERIMENTAL void doca_argp_param_set_long_name(struct doca_argp_param *param, const char *name)
Set the long name of the program param.
doca_argp_type
Flag input type.
Definition: doca_argp.h:54
doca_error_t(* doca_argp_param_cb_t)(void *, void *)
Flag callback function type.
Definition: doca_argp.h:37
DOCA_EXPERIMENTAL void doca_argp_param_set_callback(struct doca_argp_param *param, doca_argp_param_cb_t callback)
Set the callback function of the program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_mandatory(struct doca_argp_param *param)
Mark the program param as mandatory.
DOCA_EXPERIMENTAL doca_error_t doca_argp_param_create(struct doca_argp_param **param)
Create new program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_type(struct doca_argp_param *param, enum doca_argp_type type)
Set the type of the param arguments.
DOCA_EXPERIMENTAL void doca_argp_param_set_short_name(struct doca_argp_param *param, const char *name)
Set the short name of the program param.
DOCA_EXPERIMENTAL doca_error_t doca_argp_register_param(struct doca_argp_param *input_param)
Register a program flag.
DOCA_EXPERIMENTAL void doca_argp_param_set_multiplicity(struct doca_argp_param *param)
Mark the program param as supporting multiple appearances.
DOCA_STABLE doca_error_t doca_buf_inventory_destroy(struct doca_buf_inventory *inventory)
Destroy buffer inventory structure.
DOCA_STABLE doca_error_t doca_buf_inventory_start(struct doca_buf_inventory *inventory)
Start element retrieval from inventory.
DOCA_STABLE doca_error_t doca_buf_inventory_create(size_t num_elements, struct doca_buf_inventory **inventory)
Allocates buffer inventory with default/unset attributes.
void(* doca_comch_consumer_task_post_recv_completion_cb_t)(struct doca_comch_consumer_task_post_recv *task, union doca_data task_user_data, union doca_data ctx_user_data)
DOCA_STABLE doca_error_t doca_comch_consumer_create(struct doca_comch_connection *comch_connection, struct doca_mmap *buf_mmap, struct doca_comch_consumer **consumer)
DOCA_STABLE doca_error_t doca_comch_consumer_destroy(struct doca_comch_consumer *consumer)
DOCA_STABLE doca_error_t doca_comch_consumer_task_post_recv_set_conf(struct doca_comch_consumer *consumer, doca_comch_consumer_task_post_recv_completion_cb_t task_completion_cb, doca_comch_consumer_task_post_recv_completion_cb_t task_error_cb, uint32_t num_post_recv_tasks)
DOCA_STABLE struct doca_ctx * doca_comch_consumer_as_ctx(struct doca_comch_consumer *consumer)
DOCA_STABLE doca_error_t doca_comch_producer_create(struct doca_comch_connection *comch_connection, struct doca_comch_producer **producer)
void(* doca_comch_producer_task_send_completion_cb_t)(struct doca_comch_producer_task_send *task, union doca_data task_user_data, union doca_data ctx_user_data)
DOCA_STABLE doca_error_t doca_comch_producer_task_send_set_conf(struct doca_comch_producer *producer, doca_comch_producer_task_send_completion_cb_t task_completion_cb, doca_comch_producer_task_send_completion_cb_t task_error_cb, uint32_t num_send_tasks)
DOCA_STABLE doca_error_t doca_comch_producer_destroy(struct doca_comch_producer *producer)
DOCA_STABLE struct doca_ctx * doca_comch_producer_as_ctx(struct doca_comch_producer *producer)
DOCA_STABLE doca_error_t doca_ctx_start(struct doca_ctx *ctx)
Finalizes all configurations, and starts the DOCA CTX.
DOCA_STABLE doca_error_t doca_ctx_get_state(const struct doca_ctx *ctx, enum doca_ctx_states *state)
Get context state.
DOCA_STABLE doca_error_t doca_ctx_set_user_data(struct doca_ctx *ctx, union doca_data user_data)
set user data to context
DOCA_STABLE doca_error_t doca_ctx_get_num_inflight_tasks(const struct doca_ctx *ctx, size_t *num_inflight_tasks)
Get number of in flight tasks in a doca context.
DOCA_STABLE doca_error_t doca_ctx_stop(struct doca_ctx *ctx)
Stops the context allowing reconfiguration.
doca_ctx_states
This enum defines the states of a context.
Definition: doca_ctx.h:83
@ DOCA_CTX_STATE_IDLE
Definition: doca_ctx.h:88
@ DOCA_CTX_STATE_RUNNING
Definition: doca_ctx.h:98
DOCA_STABLE doca_error_t doca_devinfo_is_equal_pci_addr(const struct doca_devinfo *devinfo, const char *pci_addr_str, uint8_t *is_equal)
Check if a PCI address belongs to a DOCA devinfo.
DOCA_STABLE doca_error_t doca_dev_rep_open(struct doca_devinfo_rep *devinfo, struct doca_dev_rep **dev_rep)
Initialize representor device for use.
DOCA_STABLE doca_error_t doca_devinfo_rep_destroy_list(struct doca_devinfo_rep **dev_list_rep)
Destroy list of representor device info structures.
DOCA_STABLE doca_error_t doca_devinfo_rep_create_list(struct doca_dev *dev, int filter, struct doca_devinfo_rep ***dev_list_rep, uint32_t *nb_devs_rep)
Create list of available representor devices accessible by dev.
DOCA_STABLE doca_error_t doca_devinfo_create_list(struct doca_devinfo ***dev_list, uint32_t *nb_devs)
Creates list of all available local devices.
DOCA_STABLE doca_error_t doca_devinfo_get_ibdev_name(const struct doca_devinfo *devinfo, char *ibdev_name, uint32_t size)
Get the name of the IB device represented by a DOCA devinfo.
DOCA_STABLE doca_error_t doca_devinfo_destroy_list(struct doca_devinfo **dev_list)
Destroy list of local device info structures.
DOCA_STABLE doca_error_t doca_dev_open(struct doca_devinfo *devinfo, struct doca_dev **dev)
Initialize local device for use.
#define DOCA_DEVINFO_IFACE_NAME_SIZE
Buffer size to hold network interface name. Including a null terminator.
Definition: doca_dev.h:305
DOCA_STABLE doca_error_t doca_devinfo_rep_is_equal_pci_addr(const struct doca_devinfo_rep *devinfo_rep, const char *pci_addr_str, uint8_t *is_equal)
Check if a PCI address belongs to a DOCA devinfo_rep.
DOCA_STABLE struct doca_devinfo * doca_dev_as_devinfo(const struct doca_dev *dev)
Get local device info from device. This should be useful when wanting to query information about devi...
DOCA_STABLE doca_error_t doca_devinfo_rep_cap_is_filter_net_supported(const struct doca_devinfo *devinfo, uint8_t *filter_net_supported)
Get the remote net discovery capability of the device.
DOCA_STABLE doca_error_t doca_devinfo_get_iface_name(const struct doca_devinfo *devinfo, char *iface_name, uint32_t size)
Get the name of the ethernet interface of a DOCA devinfo.
@ DOCA_DEVINFO_REP_FILTER_NET
Definition: doca_dev.h:67
doca_ec_matrix_type
Types of coding matrix used for erasure codes.
@ DOCA_EC_MATRIX_TYPE_VANDERMONDE
@ DOCA_EC_MATRIX_TYPE_CAUCHY
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_name(doca_error_t error)
Returns the string representation of an error code name.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_ERROR_INVALID_VALUE
Definition: doca_error.h:44
@ DOCA_ERROR_IN_USE
Definition: doca_error.h:41
@ DOCA_ERROR_AGAIN
Definition: doca_error.h:43
@ DOCA_SUCCESS
Definition: doca_error.h:38
@ DOCA_ERROR_IN_PROGRESS
Definition: doca_error.h:64
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_standard(void)
Create default, non configurable backend for application messages.
#define DOCA_LOG_TRC(format,...)
Generates a TRACE application log message.
Definition: doca_log.h:513
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_with_file_sdk(FILE *fptr, struct doca_log_backend **backend)
Create a logging backend with a FILE* stream for SDK messages.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
Definition: doca_log.h:496
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_set_sdk_level(struct doca_log_backend *backend, uint32_t level)
Set the log level limit for SDK logging backends.
@ DOCA_LOG_LEVEL_WARNING
Definition: doca_log.h:47
DOCA_STABLE doca_error_t doca_mmap_set_memrange(struct doca_mmap *mmap, void *addr, size_t len)
Set the memory range of DOCA memory map.
DOCA_STABLE doca_error_t doca_mmap_destroy(struct doca_mmap *mmap)
Destroy DOCA Memory Map structure.
DOCA_STABLE doca_error_t doca_mmap_create(struct doca_mmap **mmap)
Allocates zero size memory map object with default/unset attributes.
DOCA_STABLE doca_error_t doca_mmap_create_from_export(const union doca_data *user_data, const void *export_desc, size_t export_desc_len, struct doca_dev *dev, struct doca_mmap **mmap)
Creates a memory map object representing memory ranges in remote system memory space.
DOCA_STABLE doca_error_t doca_mmap_set_permissions(struct doca_mmap *mmap, uint32_t access_mask)
Set access flags of the registered memory.
DOCA_STABLE doca_error_t doca_mmap_start(struct doca_mmap *mmap)
Start DOCA Memory Map.
DOCA_STABLE doca_error_t doca_mmap_add_dev(struct doca_mmap *mmap, struct doca_dev *dev)
Register DOCA memory map on a given device.
DOCA_STABLE doca_error_t doca_pe_connect_ctx(struct doca_pe *pe, struct doca_ctx *ctx)
This method connects a context to a progress engine.
DOCA_STABLE uint8_t doca_pe_progress(struct doca_pe *pe)
Run the progress engine.
DOCA_STABLE void doca_task_free(struct doca_task *task)
Free a task back to where it was allocated from.
DOCA_EXPERIMENTAL doca_error_t doca_rdma_destroy(struct doca_rdma *rdma)
Destroy a DOCA RDMA instance.
DOCA_EXPERIMENTAL doca_error_t doca_rdma_set_permissions(struct doca_rdma *rdma, uint32_t permissions)
Set rdma permissions for doca_rdma. The value can be queried using doca_rdma_get_permissions()....
DOCA_EXPERIMENTAL struct doca_ctx * doca_rdma_as_ctx(struct doca_rdma *rdma)
Convert doca_rdma instance into a generalized context for use with doca core objects.
DOCA_EXPERIMENTAL doca_error_t doca_rdma_create(struct doca_dev *dev, struct doca_rdma **rdma)
Create a DOCA RDMA instance.
type description
doca_mmap * make_mmap(doca_dev *dev, void const *mmap_export_blob, size_t mmap_export_blob_size)
Definition: doca_utils.cpp:188
doca_buf_inventory * make_buf_inventory(size_t num_elements)
Definition: doca_utils.cpp:205
void create_doca_logger_backend(void) noexcept
Definition: doca_utils.cpp:471
doca_comch_producer * make_comch_producer(doca_comch_connection *conn, doca_pe *pe, uint32_t task_pool_size, doca_data callback_user_data, doca_comch_producer_task_send_completion_cb_t task_cb, doca_comch_producer_task_send_completion_cb_t error_cb)
Definition: doca_utils.cpp:279
doca_rdma * make_rdma_context(doca_dev *dev, doca_pe *pe, doca_data ctx_user_data, uint32_t permissions)
Definition: doca_utils.cpp:331
void register_cli_argument(doca_argp_type type, char const *short_name, char const *long_name, char const *description, value_requirement requirement, value_multiplicity multiplicity, doca_argp_param_cb_t callback)
Definition: doca_utils.cpp:413
doca_ec_matrix_type matrix_type_from_string(std::string const &matrix_type)
Definition: doca_utils.cpp:503
doca_dev_rep * open_representor(doca_dev *dev, std::string const &identifier)
Definition: doca_utils.cpp:104
doca_comch_consumer * make_comch_consumer(doca_comch_connection *conn, doca_mmap *mmap, doca_pe *pe, uint32_t task_pool_size, doca_data callback_user_data, doca_comch_consumer_task_post_recv_completion_cb_t task_cb, doca_comch_consumer_task_post_recv_completion_cb_t error_cb)
Definition: doca_utils.cpp:224
doca_error_t stop_context(doca_ctx *ctx, doca_pe *pe, std::vector< doca_task * > &ctx_tasks) noexcept
Definition: doca_utils.cpp:375
doca_dev * open_device(std::string const &identifier)
Definition: doca_utils.cpp:43
static bool is_ctx_running(struct doca_ctx *ctx)
uint8_t type
Definition: packets.h:0
Convenience type for representing opaque data.
Definition: doca_types.h:56
uint64_t u64
Definition: doca_types.h:58
struct upf_accel_ctx * ctx