36 #include <arpa/inet.h>
40 #include <ucp/api/ucp.h>
54 #define FLUSH_ID 0xbeef
55 #define MAX_WORKER_ADDRESS_LEN 1024
126 struct addrinfo *res, *t;
127 struct addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
128 static int client_sockfd = -1;
130 if (client_sockfd >= 0)
133 if (asprintf(&service,
"%d", port) < 0)
136 n = getaddrinfo(server_name, service, &hints, &res);
138 DOCA_LOG_ERR(
"getaddrinfo() returned error [%s] for %s:%d", gai_strerror(n), server_name, port);
143 for (t = res; t; t = t->ai_next) {
144 client_sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
145 if (client_sockfd >= 0) {
146 if (!connect(client_sockfd, t->ai_addr, t->ai_addrlen))
148 close(client_sockfd);
156 if (client_sockfd < 0) {
157 DOCA_LOG_ERR(
"Couldn't connect to %s:%d", server_name, port);
163 ret = write(client_sockfd, &loc_datalen,
sizeof(loc_datalen));
164 if (ret < 0 || (
size_t)ret !=
sizeof(loc_datalen)) {
169 ret = write(client_sockfd, loc_data, loc_datalen);
170 if (ret < 0 || (
size_t)ret != loc_datalen) {
176 ret = read(client_sockfd, rem_datalen,
sizeof(*rem_datalen));
177 if (ret < 0 || (
size_t)ret !=
sizeof(*rem_datalen)) {
190 data = calloc(1, *rem_datalen);
196 ret = read(client_sockfd, data, *rem_datalen);
197 if (ret < 0 || (
size_t)ret != *rem_datalen) {
205 DOCA_LOG_INFO(
"Client received remote data, length: %lu", *rem_datalen);
223 ucp_ep_h client_ucp_ep,
232 int chunks =
len / chunk_size;
234 ucs_status_ptr_t ucs_status_ptr;
237 ucp_request_param_t req_param = {
238 .op_attr_mask = UCP_OP_ATTR_FIELD_FLAGS,
239 .flags = UCP_AM_SEND_FLAG_REPLY,
243 uint8_t req_data[req_data_len];
245 memset(req_data, 0, req_data_len);
247 hdr = alloca(hdr_len);
257 scatter_hdr->
count = chunks;
260 for (i = 0; i < chunks; i++) {
262 iov->
len = chunk_size;
264 memcpy(iov + 1, data, chunk_size);
267 target += chunk_size;
271 ucs_status_ptr = ucp_am_send_nbx(client_ucp_ep, 0, hdr, hdr_len, req_data, req_data_len, &req_param);
272 if (UCS_PTR_IS_ERR(ucs_status_ptr))
275 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
276 while (ucp_request_check_status(ucs_status_ptr) == UCS_INPROGRESS)
277 ucp_worker_progress(client_ucp_worker);
279 if (ucp_request_check_status(ucs_status_ptr) != UCS_OK)
281 ucp_request_free(ucs_status_ptr);
283 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
302 ucs_status_ptr_t ucs_status_ptr;
304 size_t hdr_len =
sizeof(*hdr) +
sizeof(*flush_hdr);
305 ucp_request_param_t req_param = {
306 .op_attr_mask = UCP_OP_ATTR_FIELD_FLAGS,
307 .flags = UCP_AM_SEND_FLAG_REPLY,
310 hdr = alloca(hdr_len);
319 ucs_status_ptr = ucp_am_send_nbx(client_ucp_ep, 0, hdr, hdr_len,
NULL, 0, &req_param);
320 if (UCS_PTR_IS_ERR(ucs_status_ptr)) {
322 ucs_status_string(ucp_request_check_status(ucs_status_ptr)));
326 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
327 while (ucp_request_check_status(ucs_status_ptr) == UCS_INPROGRESS)
328 ucp_worker_progress(client_ucp_worker);
330 if (ucp_request_check_status(ucs_status_ptr) != UCS_OK)
333 ucp_request_free(ucs_status_ptr);
335 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
342 ucp_worker_progress(client_ucp_worker);
360 ucp_ep_h client_ucp_ep,
368 ucs_status_ptr_t ucs_status_ptr;
371 ucp_request_param_t req_param = {
372 .op_attr_mask = UCP_OP_ATTR_FIELD_FLAGS,
373 .
flags = UCP_AM_SEND_FLAG_REPLY,
376 hdr = alloca(hdr_len);
387 ucs_status_ptr = ucp_am_send_nbx(client_ucp_ep, 0, hdr, hdr_len, data,
len, &req_param);
388 if (UCS_PTR_IS_ERR(ucs_status_ptr)) {
390 ucs_status_string(ucp_request_check_status(ucs_status_ptr)));
394 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
395 while (ucp_request_check_status(ucs_status_ptr) == UCS_INPROGRESS)
396 ucp_worker_progress(client_ucp_worker);
398 if (ucp_request_check_status(ucs_status_ptr) != UCS_OK)
401 ucp_request_free(ucs_status_ptr);
403 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
423 size_t header_length,
426 const ucp_am_recv_param_t *param)
433 int *flushed = (
int *)arg;
458 ucp_ep_h *client_ucp_ep,
459 ucp_worker_h *ucp_worker,
461 ucp_context_h *ucp_context_p)
464 ucp_params_t ucp_params;
465 ucs_status_t ucs_status;
466 ucp_config_t *ucp_config;
467 ucp_context_h ucp_context;
468 ucs_status_ptr_t close_req;
469 ucp_worker_h client_ucp_worker;
470 ucp_am_handler_param_t am_param;
471 ucp_ep_params_t ep_params = {0};
472 ucp_worker_params_t worker_params;
473 size_t client_worker_addr_len, client_peer_dev_addr_len;
474 ucp_address_t *client_worker_addr =
NULL, *client_peer_dev_addr =
NULL;
475 ucp_request_param_t close_params = {
476 .op_attr_mask = UCP_OP_ATTR_FIELD_FLAGS,
478 .flags = UCP_OP_ATTR_FIELD_FLAGS};
480 ucs_status = ucp_config_read(
NULL,
NULL, &ucp_config);
481 if (ucs_status != UCS_OK) {
486 ucp_params.field_mask = UCP_PARAM_FIELD_FEATURES;
487 ucp_params.features = UCP_FEATURE_AM | UCP_FEATURE_RMA | UCP_FEATURE_AMO64 | UCP_FEATURE_EXPORTED_MEMH;
489 ucs_status = ucp_init(&ucp_params, ucp_config, &ucp_context);
490 ucp_config_release(ucp_config);
491 if (ucs_status != UCS_OK) {
496 worker_params.field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE;
497 worker_params.thread_mode = UCS_THREAD_MODE_SINGLE;
500 ucs_status = ucp_worker_create(ucp_context, &worker_params, &client_ucp_worker);
501 if (ucs_status != UCS_OK) {
504 goto ucp_context_free;
507 ucs_status = ucp_worker_get_address(client_ucp_worker, &client_worker_addr, &client_worker_addr_len);
508 if (ucs_status != UCS_OK) {
511 goto ucp_worker_destroy;
520 client_worker_addr_len,
521 (
void **)&client_peer_dev_addr,
522 &client_peer_dev_addr_len);
525 goto worker_addr_destroy;
528 DOCA_LOG_INFO(
"Received dev addr (len: %lu)", client_peer_dev_addr_len);
531 ep_params.field_mask = UCP_EP_PARAM_FIELD_REMOTE_ADDRESS;
532 ep_params.address = client_peer_dev_addr;
534 ucs_status = ucp_ep_create(client_ucp_worker, &ep_params, client_ucp_ep);
535 if (ucs_status != UCS_OK) {
541 am_param.field_mask = UCP_AM_HANDLER_PARAM_FIELD_ID | UCP_AM_HANDLER_PARAM_FIELD_CB |
542 UCP_AM_HANDLER_PARAM_FIELD_ARG;
545 am_param.arg = flushed;
547 ucs_status = ucp_worker_set_am_recv_handler(client_ucp_worker, &am_param);
548 if (ucs_status != UCS_OK) {
556 ucp_worker_release_address(client_ucp_worker, client_worker_addr);
557 free(client_peer_dev_addr);
559 *ucp_worker = client_ucp_worker;
560 *ucp_context_p = ucp_context;
565 close_req = ucp_ep_close_nbx(*client_ucp_ep, &close_params);
566 if (UCS_PTR_IS_PTR(close_req)) {
570 ucp_worker_progress(client_ucp_worker);
571 }
while (ucp_request_check_status(close_req) == UCS_INPROGRESS);
574 ucp_request_free(close_req);
578 free(client_peer_dev_addr);
581 ucp_worker_release_address(client_ucp_worker, client_worker_addr);
584 ucp_worker_destroy(client_ucp_worker);
587 ucp_cleanup(ucp_context);
601 ucs_status_ptr_t close_req;
602 ucp_request_param_t close_params = {
603 .op_attr_mask = UCP_OP_ATTR_FIELD_FLAGS,
605 .flags = UCP_OP_ATTR_FIELD_FLAGS};
607 close_req = ucp_ep_close_nbx(client_ucp_ep, &close_params);
608 if (UCS_PTR_IS_PTR(close_req)) {
612 ucp_worker_progress(ucp_worker);
613 }
while (ucp_request_check_status(close_req) == UCS_INPROGRESS);
616 ucp_request_free(close_req);
619 ucp_worker_destroy(ucp_worker);
620 ucp_cleanup(ucp_context);
664 struct addrinfo *res, *t;
665 struct addrinfo hints = {.ai_flags = AI_PASSIVE, .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
666 static int server_sockfd = -1, server_connfd = -1;
668 if (server_connfd >= 0)
671 if (asprintf(&service,
"%d", port) < 0)
674 n = getaddrinfo(
NULL, service, &hints, &res);
681 for (t = res; t; t = t->ai_next) {
682 server_sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
683 if (server_sockfd >= 0) {
685 if (setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &n,
sizeof n) != 0) {
686 close(server_sockfd);
691 if (!bind(server_sockfd, t->ai_addr, t->ai_addrlen))
693 close(server_sockfd);
701 if (server_sockfd < 0) {
706 listen(server_sockfd, 1);
707 server_connfd = accept(server_sockfd,
NULL,
NULL);
708 if (server_connfd < 0) {
714 ret = write(server_connfd, &loc_datalen,
sizeof(loc_datalen));
715 if (ret < 0 || (
size_t)ret !=
sizeof(loc_datalen)) {
720 ret = write(server_connfd, loc_data, loc_datalen);
721 if (ret < 0 || (
size_t)ret != loc_datalen) {
727 ret = read(server_connfd, rem_datalen,
sizeof(*rem_datalen));
728 if (ret < 0 || (
size_t)ret !=
sizeof(*rem_datalen)) {
729 DOCA_LOG_ERR(
"%ld/%lu: Couldn't read remote data", ret,
sizeof(*rem_datalen));
741 data = malloc(*rem_datalen);
743 DOCA_LOG_ERR(
"Failed to create server exchanged data buffer");
747 ret = read(server_connfd, data, *rem_datalen);
748 if (ret < 0 || (
size_t)ret != *rem_datalen) {
750 DOCA_LOG_ERR(
"%ld/%lu: Couldn't read remote data", ret, *rem_datalen);
756 DOCA_LOG_INFO(
"Server received remote data, length: %lu", *rem_datalen);
775 struct doca_urom_worker *worker,
777 ucp_context_h ucp_context,
788 size_t packed_memh_len;
789 size_t packed_rkey_len;
791 ucs_status_t ucs_status;
793 ucp_mem_map_params_t mmap_params;
794 ucp_memh_pack_params_t pack_params;
799 mmap_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_ADDRESS | UCP_MEM_MAP_PARAM_FIELD_LENGTH;
800 mmap_params.address = buf;
801 mmap_params.length =
len;
803 ucs_status = ucp_mem_map(ucp_context, &mmap_params, &mh);
804 if (ucs_status != UCS_OK) {
805 DOCA_LOG_ERR(
"ucp_mem_map() returned an error [%s]", ucs_status_string(ucs_status));
810 ucs_status = ucp_rkey_pack(ucp_context, mh, &packed_rkey, &packed_rkey_len);
811 if (ucs_status != UCS_OK) {
812 DOCA_LOG_ERR(
"ucp_rkey_pack() returned an error [%s]", ucs_status_string(ucs_status));
818 pack_params.field_mask = UCP_MEMH_PACK_PARAM_FIELD_FLAGS;
819 pack_params.flags = UCP_MEMH_PACK_FLAG_EXPORT;
821 ucs_status = ucp_memh_pack(mh, &pack_params, &packed_memh, &packed_memh_len);
822 if (ucs_status == UCS_OK) {
823 DOCA_LOG_INFO(
"ucp_memh_pack() packed length: %lu", packed_memh_len);
824 }
else if (ucs_status == UCS_ERR_UNSUPPORTED) {
829 DOCA_LOG_ERR(
"ucp_memh_pack() returned error [%s]", ucs_status_string(ucs_status));
831 goto packed_rkey_free;
852 ucp_worker_progress(server_ucp_worker);
863 ucp_rkey_buffer_release(packed_rkey);
864 ucp_memh_buffer_release(packed_memh,
NULL);
870 ucp_memh_buffer_release(packed_memh,
NULL);
873 ucp_rkey_buffer_release(packed_rkey);
876 if (ucp_mem_unmap(ucp_context, mh) != UCS_OK)
1003 DOCA_LOG_ERR(
"MR deregister notification received wrong rkey");
1041 DOCA_LOG_ERR(
"RQ destroy notification received wrong id");
1062 ucp_context_h *ucp_context,
1063 ucp_worker_h *server_ucp_worker,
1068 uint64_t server_rq_id;
1070 ucs_status_t ucs_status;
1071 ucp_config_t *ucp_config;
1072 ucp_params_t ucp_params;
1074 size_t server_worker_addr_len;
1075 ucp_address_t *server_worker_addr;
1076 size_t server_peer_host_addr_len;
1077 ucp_worker_params_t worker_params;
1078 ucp_address_t *server_peer_host_addr;
1082 ucs_status = ucp_config_read(
NULL,
NULL, &ucp_config);
1083 if (ucs_status != UCS_OK) {
1089 ucp_params.field_mask = UCP_PARAM_FIELD_FEATURES;
1090 ucp_params.features = UCP_FEATURE_AM | UCP_FEATURE_RMA | UCP_FEATURE_AMO64 | UCP_FEATURE_EXPORTED_MEMH;
1092 ucs_status = ucp_init(&ucp_params, ucp_config, ucp_context);
1093 ucp_config_release(ucp_config);
1094 if (ucs_status != UCS_OK) {
1099 worker_params.field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE;
1100 worker_params.thread_mode = UCS_THREAD_MODE_SINGLE;
1103 ucs_status = ucp_worker_create(*ucp_context, &worker_params, server_ucp_worker);
1104 if (ucs_status != UCS_OK) {
1107 goto ucp_context_free;
1110 ucs_status = ucp_worker_get_address(*server_ucp_worker, &server_worker_addr, &server_worker_addr_len);
1111 if (ucs_status != UCS_OK) {
1114 goto worker_destroy;
1125 server_worker_addr_len,
1130 goto worker_addr_destroy;
1135 ucp_worker_progress(*server_ucp_worker);
1141 goto worker_addr_destroy;
1144 DOCA_LOG_INFO(
"Initialized RDMO client (host addr len: %lu, dev addr len: %lu)",
1145 server_worker_addr_len,
1152 (
void **)&server_peer_host_addr,
1153 &server_peer_host_addr_len);
1157 goto worker_addr_destroy;
1160 DOCA_LOG_INFO(
"Received host addr (len: %lu)", server_peer_host_addr_len);
1172 free(server_peer_host_addr);
1173 goto worker_addr_destroy;
1178 ucp_worker_release_address(*server_ucp_worker, server_worker_addr);
1179 free(server_peer_host_addr);
1180 *rq_id = server_rq_id;
1183 worker_addr_destroy:
1184 ucp_worker_release_address(*server_ucp_worker, server_worker_addr);
1187 ucp_worker_destroy(*server_ucp_worker);
1190 ucp_cleanup(*ucp_context);
1206 struct doca_pe **
pe,
1207 struct doca_urom_service **service,
1208 struct doca_urom_worker **worker,
1209 struct doca_dev **dev)
1211 size_t i, plugins_count = 0;
1212 char *plugin_name =
"worker_rdmo";
1234 for (i = 0; i < plugins_count; i++) {
1236 rdmo_info = &plugins[i];
1241 if (rdmo_info ==
NULL) {
1264 goto worker_cleanup;
1313 struct doca_urom_service *service,
1314 struct doca_urom_worker *worker,
1315 struct doca_dev *dev)
1399 char *
mode = (
char *)param;
1404 if (strcmp(
"client",
mode) == 0)
1406 else if (strcmp(
"server",
mode) == 0)
1430 if (
len == HOST_NAME_MAX) {
1431 DOCA_LOG_ERR(
"Entered server name exceeding the maximum size of %d", HOST_NAME_MAX - 1);
1445 size_t bytes_sent = 8;
1447 uint64_t rq_id = 0, expected_ptr;
1448 bool succeeded =
true;
1449 void *queue_buf =
NULL;
1450 ucp_context_h ucp_context;
1452 char *byte, data_val = 0x33;
1453 size_t queue_len = 128 * 1024;
1454 ucp_worker_h server_ucp_worker;
1456 size_t i, *queue_ptr, send_len = 8;
1457 uint64_t rbuf_desc_len,
rkey = 0;
1460 struct doca_dev *dev;
1461 struct doca_urom_service *service;
1462 struct doca_urom_worker *worker;
1464 if (device_name ==
NULL)
1482 queue_buf = calloc(1, queue_len);
1483 if (queue_buf ==
NULL) {
1488 queue_ptr = queue_buf;
1489 *queue_ptr = (uint64_t)(queue_ptr + 1);
1491 result =
rdmo_mr_reg(server_ucp_worker, worker,
pe, ucp_context, queue_buf, queue_len, &memh, &rkey);
1499 DOCA_LOG_INFO(
"Sent rkey %lu and queue pointer %p", rkey, queue_ptr);
1508 expected_ptr = (
uintptr_t)queue_buf +
sizeof(queue_ptr) + bytes_sent;
1509 while (*queue_ptr != expected_ptr) {
1510 ucp_worker_progress(server_ucp_worker);
1515 byte = (
char *)&queue_ptr[1];
1516 for (i = 0; i < bytes_sent; i++) {
1517 if (
byte[i] != data_val) {
1519 DOCA_LOG_ERR(
"Append bad data[%ld]: %#x, expected: %#x", i,
byte[i], data_val);
1528 DOCA_LOG_INFO(
"Append operation was finished successfully");
1531 ucp_worker_progress(server_ucp_worker);
1533 memset(queue_ptr, 0, queue_len);
1539 byte = (
char *)queue_ptr;
1540 while (
byte[send_len - 1] != data_val) {
1541 ucp_worker_progress(server_ucp_worker);
1546 for (i = 0; i < send_len; i++) {
1547 if (
byte[i] != data_val) {
1549 DOCA_LOG_ERR(
"Scatter Bad data[%ld]: %#x, expected: %#x", i,
byte[i], data_val);
1558 DOCA_LOG_INFO(
"Scatter operation was finished successfully");
1563 ucp_mem_unmap(ucp_context, memh);
1573 ucp_worker_destroy(server_ucp_worker);
1574 ucp_cleanup(ucp_context);
1588 char data_val = 0x33;
1589 void *send_buf =
NULL;
1590 ucp_ep_h client_ucp_ep;
1591 ucp_worker_h ucp_worker;
1592 ucp_context_h ucp_context;
1593 size_t queue_len = 128 * 1024;
1595 int flushed = 0, port = 18515;
1596 uint64_t
rkey, rbuf_desc_len, *queue_ptr;
1597 int scatter_chunk_size = 8, scatter_chunks = 16;
1607 send_buf = calloc(1, queue_len);
1608 if (send_buf ==
NULL) {
1614 memset(send_buf, data_val, queue_len);
1649 DOCA_LOG_ERR(
"Failed to execute barrier between client and server");
1654 send_len = scatter_chunk_size * scatter_chunks;
1658 (uint64_t)queue_ptr,
1689 struct doca_argp_param *server_name, *mode;
doca_error_t open_doca_device_with_ibdev_name(const uint8_t *value, size_t val_size, tasks_check func, struct doca_dev **retval)
if(bitoffset % 64+bitlength > 64) result|
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_EXPERIMENTAL void doca_argp_param_set_arguments(struct doca_argp_param *param, const char *arguments)
Set the description of the expected arguments of the program param, used during program usage.
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_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_stop(struct doca_ctx *ctx)
Stops the context allowing reconfiguration.
doca_ctx_states
This enum defines the states of a context.
@ DOCA_CTX_STATE_STARTING
DOCA_STABLE doca_error_t doca_dev_close(struct doca_dev *dev)
Destroy allocated local device instance.
#define DOCA_ERROR_PROPAGATE(r, t)
Save the first encountered doca_error_t.
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_ERROR_INVALID_VALUE
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_WARN(format,...)
Generates a WARNING application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
DOCA_STABLE doca_error_t doca_pe_destroy(struct doca_pe *pe)
Destroy doca progress engine.
DOCA_STABLE uint8_t doca_pe_progress(struct doca_pe *pe)
Run the progress engine.
DOCA_STABLE doca_error_t doca_pe_create(struct doca_pe **pe)
Creates DOCA progress engine.
DOCA_EXPERIMENTAL doca_error_t doca_urom_service_get_plugins_list(struct doca_urom_service *service_ctx, const struct doca_urom_service_plugin_info **plugins, size_t *plugins_count)
This method gets the list of supported plugins on service's DPU side.
DOCA_EXPERIMENTAL struct doca_ctx * doca_urom_service_as_ctx(struct doca_urom_service *service_ctx)
Convert service_ctx instance into a generalized context for use with DOCA core objects.
DOCA_EXPERIMENTAL doca_error_t doca_urom_service_destroy(struct doca_urom_service *service_ctx)
This method destroys a UROM Service context.
DOCA_EXPERIMENTAL doca_error_t doca_urom_worker_destroy(struct doca_urom_worker *worker_ctx)
This method destroys a UROM Worker context.
#define DOCA_UROM_WORKER_ID_ANY
DOCA UROM WORKER ID any give the library the responsibility to generate a worker id.
DOCA_EXPERIMENTAL struct doca_ctx * doca_urom_worker_as_ctx(struct doca_urom_worker *worker_ctx)
doca_error_t urom_rdmo_task_mr_deregister(struct doca_urom_worker *worker_ctx, union doca_data cookie, uint64_t rkey_id, urom_rdmo_mr_deregister_finished cb)
doca_error_t urom_rdmo_init(uint64_t plugin_id, uint64_t version)
doca_error_t urom_rdmo_task_rq_destroy(struct doca_urom_worker *worker_ctx, union doca_data cookie, uint64_t rq_id, urom_rdmo_rq_destroy_finished cb)
doca_error_t urom_rdmo_task_client_init(struct doca_urom_worker *worker_ctx, union doca_data cookie, uint64_t id, void *addr, uint64_t addr_len, urom_rdmo_client_init_finished cb)
doca_error_t urom_rdmo_task_mr_register(struct doca_urom_worker *worker_ctx, union doca_data cookie, uint64_t va, uint64_t len, void *rkey, uint64_t rkey_len, void *memh, uint64_t memh_len, urom_rdmo_mr_register_finished cb)
doca_error_t urom_rdmo_task_rq_create(struct doca_urom_worker *worker_ctx, union doca_data cookie, void *addr, uint64_t addr_len, urom_rdmo_rq_create_finished cb)
__UINTPTR_TYPE__ uintptr_t
char plugin_name[DOCA_UROM_PLUGIN_NAME_MAX_LEN]
char server_name[HOST_NAME_MAX]
struct mr_deregister_result mr_dereg
struct rq_destroy_result rq_destroy
struct mr_register_result mr_reg
struct client_init_result client_init
struct rq_create_result rq_create
Convenience type for representing opaque data.
doca_error_t start_urom_service(struct doca_pe *pe, struct doca_dev *dev, uint64_t nb_workers, struct doca_urom_service **service)
doca_error_t register_urom_common_params(void)
doca_error_t start_urom_worker(struct doca_pe *pe, struct doca_urom_service *service, uint64_t worker_id, uint32_t *gid, uint64_t nb_tasks, doca_cpu_set_t *cpuset, char **env, size_t env_count, uint64_t plugins, struct doca_urom_worker **worker)
@ UROM_RDMO_REQ_FLAG_FENCE
doca_error_t register_urom_rdmo_params(void)
static doca_error_t server_address_callback(void *param, void *config)
static void rq_create_finished(doca_error_t result, union doca_data cookie, uint64_t rq_id)
static ucs_status_t rdmo_am_cb(void *arg, const void *header, size_t header_length, void *data, size_t length, const ucp_am_recv_param_t *param)
static doca_error_t rdmo_server_urom_init(char *device_name, struct doca_pe **pe, struct doca_urom_service **service, struct doca_urom_worker **worker, struct doca_dev **dev)
static doca_error_t rdmo_deregister_mr(struct doca_urom_worker *worker, struct doca_pe *pe, uint64_t rkey)
static doca_error_t rdmo_destroy_rq(struct doca_urom_worker *worker, struct doca_pe *pe, uint64_t rq_id)
#define MAX_WORKER_ADDRESS_LEN
static void client_init_finished(doca_error_t result, union doca_data cookie, void *addr, uint64_t addr_len)
static doca_error_t rdmo_scatter(ucp_worker_h client_ucp_worker, ucp_ep_h client_ucp_ep, uint64_t target, void *data, size_t len, int chunk_size, uint64_t rkey)
static doca_error_t rdmo_wireup_client(char *server_name, int port, ucp_ep_h *client_ucp_ep, ucp_worker_h *ucp_worker, int *flushed, ucp_context_h *ucp_context_p)
static void rq_destroy_finished(doca_error_t result, union doca_data cookie, uint64_t rq_id)
static doca_error_t rdmo_append(ucp_worker_h client_ucp_worker, ucp_ep_h client_ucp_ep, uint64_t *ptr_addr, void *data, size_t len, uint64_t rkey)
static doca_error_t client_exchange(const char *server_name, int port, void *loc_data, size_t loc_datalen, void **rem_data, size_t *rem_datalen)
doca_error_t rdmo_client(char *server_name)
static void mr_register_finished(doca_error_t result, union doca_data cookie, uint64_t rkey)
static doca_error_t mode_callback(void *param, void *config)
static doca_error_t rdmo_wireup_server(struct doca_urom_worker *worker, struct doca_pe *pe, int port, ucp_context_h *ucp_context, ucp_worker_h *server_ucp_worker, uint64_t *rq_id)
static doca_error_t rdmo_flush(ucp_worker_h client_ucp_worker, ucp_ep_h client_ucp_ep, int *flushed)
DOCA_LOG_REGISTER(UROM::RDMO::CORE)
static doca_error_t rdmo_mr_reg(ucp_worker_h server_ucp_worker, struct doca_urom_worker *worker, struct doca_pe *pe, ucp_context_h ucp_context, void *buf, size_t len, ucp_mem_h *memh, uint64_t *rkey)
doca_error_t rdmo_server(char *device_name)
static doca_error_t server_exchange(int port, void *loc_data, size_t loc_datalen, void **rem_data, size_t *rem_datalen)
static doca_error_t rdmo_server_urom_destroy(struct doca_pe *pe, struct doca_urom_service *service, struct doca_urom_worker *worker, struct doca_dev *dev)
static doca_error_t cs_barrier(const char *server_name, int port, enum rdmo_mode mode)
static void mr_deregister_finished(doca_error_t result, union doca_data cookie, uint64_t rkey)
static void rdmo_ucp_client_destroy(ucp_ep_h client_ucp_ep, ucp_worker_h ucp_worker, ucp_context_h ucp_context)
size_t strlcpy(char *dst, const char *src, size_t size)